可以在Lisp中使用循环外的"it"命令吗?

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中的例子.

  • 看到?宏如此流畅,即使你使用其中一个,你也可以忘记它们的存在,例如`loop`. (2认同)