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 我对这个问题的回答类似于梵蒂娜对这个问题的回答,但没有计数;作为旁注,我认为计数是危险的脆弱-您可以在更新代码时引入重新排序错误。也许最好提供一种方法来命名以前的结果——但在实践中,除了最后一个结果,我很少需要其他结果。如果您需要它们,也许您应该编写一个函数而不是一个链接表达式。 |
lightning_missile · 词法范围和共享对象 6 年前 |
Alexandru Popa · SBCL中奇怪的宏扩展错误 6 年前 |
Jacky · 编辑列表中的每个偶数索引元素 6 年前 |
HappyFace · lisp典型缩进约定背后的规则是什么? 6 年前 |
Jorge · 在公共Lisp中初始化计数器变量 6 年前 |
Rorschach · cl循环破坏性修改cons单元 6 年前 |