gpt4 book ai didi

lisp - 如何使用不对称(未配对)的任意括号创建宏

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:33 24 4
gpt4 key购买 nike

我想定义一个宏来封装下面的频繁模式。代码为lispworks的FLI。

(fli:with-foreign-string ;; class name pointer
(cn-p ec bc :external-format (external-format)) "BUTTON"
(fli:with-foreign-string ;; window name pointer
(wn-p ec bc :external-format (external-format)) "Configuartion:server"
(let ((grpbx (createwindowex 0 cn-p wn-p
(logior ws_visible ws_child bs_groupbox)
0 0 300 420 hwnd 1 (GetModuleHandle-current 0) 0)))
(fli:with-foreign-string ;; class name pointer
(cn-p ec bc :external-format (external-format)) "EDIT"
(fli:with-foreign-string ;; window name pointer
(wn-p ec bc :external-format (external-format)) "192.168.200.200"
(createwindowex 0 cn-p wn-p
(logior ws_visible ws_child ws_border)
10 30 150 30 hwnd 1 (GetModuleHandle-current 0) 0)
)))))

我要创建的宏如下所示:strs 参数是一个字符串列表,例如("BUTTON""Configuartion:server") 上面,str-syms 累积转换后的字符串,这些字符串将被提供给 createwindoex。令我困惑的是要使用的字符串 (cn-p and wn-p) 在 body 的中间,我不得不将 body 分成两部分:part-bdy&body bdy。

但问题是 part-bdy,它是 LET block 的第一部分(在 createwindoex 之前),有很多括号,其计数器部分仅在发送部分(&body bdy)。这意味着 part-bdy 中的括号未打开并在计算时导致错误。你有什么好主意建议我解决吗?

(defmacro with-foreign-string (strs str-syms part-bdy &body bdy)
(let ((g (gensym)))
(if (null strs)
(append part-bdy str-syms bdy)
`(fli:with-foreign-string
(,g ec bc :external-format (external-format)) ,(car strs)
(with-foreign-string ,(cdr strs) ,(cons g str-syms) ,part-bdy ,@bdy)))))

最佳答案

只是想分享一下我更改了宏,如下所示:

(defmacro with-foreign-str (strs str-syms bdy)
(if (null strs)
bdy
`(let ((,(car str-syms) (gensym)))
(fli:with-foreign-string
(,(car str-syms) ec bc :external-format (external-format)) ,(car strs)
(with-foreign-str ,(cdr strs) ,(cdr str-syms) ,bdy)))))

那么上面不使用宏的代码代码可以改写成这样:

  (WITH-FOREIGN-STR ("BUTTON" "Configuartion: server") (cn-p wn-p)
(let ((grpbx (createwindowex 0 cn-p wn-p
(logior ws_visible ws_child bs_groupbox)
0 0 300 420 hwnd 1 (GetModuleHandle-current 0) 0)))
(WITH-FOREIGN-STR ("EDIT" "192.168.200.95") (cn-p3 wn-p3)
(createwindowex 0 cn-p3 wn-p3
(logior ws_visible ws_child ws_border)
10 30 150 30 hwnd 1 (GetModuleHandle-current 0) 0))))

这仍然不是很干净,但无论如何我可以设法使用宏来简化代码。没有那么多回复只是因为我认为是由于代码中的 FLI 和 win32 API。

关于lisp - 如何使用不对称(未配对)的任意括号创建宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com