Dav*_*egg 1 lisp common-lisp syntactic-sugar
我知道在Lisp循环中,可以使用特殊变量"it",如Gigamonkeys的这个例子:
(loop for key in some-list when (gethash key some-hash) collect it)
Run Code Online (Sandbox Code Playgroud)
我想知道除了使用let显式存储它之外是否还有一个等效的概念,如下所示:
(let ((result (foo input)))
(when result (push result acc)))
Run Code Online (Sandbox Code Playgroud)
我可以使用let,但我只是好奇是否有一些语法糖可以使我的代码更简洁.
Dan*_*zer 11
lisp-y答案是,谁在乎是否没有语法,只需添加自己的语法.
(defmacro awhen (test &body body)
`(let ((it ,test))
(when it ,@body)))
Run Code Online (Sandbox Code Playgroud)
然后使用它
(awhen (expensive-computation)
(format t "~a~%" it))
Run Code Online (Sandbox Code Playgroud)
这类宏通常以"a"为前缀,用于回指.参见aifPaul Graham在On Lisp中的例子.