![]() |
1
7
像这样? (defun chain-expander (forms) (cond ((null (cdr forms)) (car forms)) (t `(let ((it ,(car forms))) ,(chain-expander (cdr forms)))))) (defun chain-counted-expander (forms counter) (cond ((null (cdr forms)) (car forms)) (t (let* ((name (format nil "_~d" counter)) (anaphora (or (find-symbol name) (intern name)))) `(let ((,anaphora ,(car forms))) ,(chain-counted-expander (cdr forms) (1+ counter))))))) (defmacro chain (&body forms) (chain-expander forms)) 如果您希望使用_1、_2等可用的内容,只需将对chain-expander的调用替换为对chain-counted-expander的调用(使用您首选的第一个数字,我建议使用0或1)。请注意,它只显式地满足使用_ n 作为一个参考,但是改变它以便它也绑定到每个后续级别并不难。 |
![]() |
2
4
为什么不只是
? 或者把它变成一个函数? |
![]() |
3
2
您可以使用ablock宏 On Lisp
宏将前一个表达式的值绑定到“it”,但如果需要,可以将其更改为“uuu”。 当然,您也可以将名称更改为->或其他您喜欢的名称。 |
![]() |
5
0
你可能会发现这个问题很有趣: Tacit programming in Lisp 我对这个问题的回答类似于梵蒂娜对这个问题的回答,但没有计数;作为旁注,我认为计数是危险的脆弱-您可以在更新代码时引入重新排序错误。也许最好提供一种方法来命名以前的结果——但在实践中,除了最后一个结果,我很少需要其他结果。如果您需要它们,也许您应该编写一个函数而不是一个链接表达式。 |
![]() |
TSG · 创建定义编译器变量并调用方法的C++宏 4 月前 |
![]() |
Edward Falk · 你能比较C预处理器中的两个常量指针吗? 6 月前 |
![]() |
ma1169 · 宏:不应忽略void值 10 月前 |
![]() |
Bhargav Patil · 运算符的大小并尝试打印数组 10 月前 |
![]() |
David Robie · VIM:寄存器中填充字符断点宏的有向图 11 月前 |
![]() |
Sofia Zaiafarova · 定义宏并使用数据类型查找绝对值 12 月前 |
![]() |
Daniel Muñoz · C[重复]中类宏函数的语法 1 年前 |
![]() |
SupAl · 避免在没有宏的情况下构建对象 1 年前 |