2013-07-19 23 views
1

我知道,在一個Lisp循環,可以在這個例子中使用特殊的變量「它」,從Gigamonkeys:可以在Lisp的循環之外使用「it」命令嗎?

(loop for key in some-list when (gethash key some-hash) collect it) 

我在想,如果有一個循環之外的任何等同概念,除了使用讓存儲它明確地說,是這樣的:

(let ((result (foo input))) 
    (when result (push result acc))) 

我可以用讓,但我只是好奇,是否有一些語法糖,可以使我的代碼更簡潔。

回答

11

lisp-y的答案是,誰在乎,如果沒有語法,只需添加自己的。

(defmacro awhen (test &body body) 
    `(let ((it ,test)) 
      (when it ,@body))) 

,然後用它

(awhen (expensive-computation) 
     (format t "~a~%" it)) 

這個類的宏經常前綴爲 「A」 的照應。請參閱aif關於Paul Graham在On Lisp中的示例。

+0

謝謝!徹底忘記了lisp的那個小小的好處。 –

+2

請參閱?宏如此流暢,即使在使用其中一個宏時,實際上也可能忘記它們存在,例如'loop'。 – Kaz

+0

還有一個包含許多正常控制結構的指代版本的軟件包。它被稱爲回指。請參閱:http://common-lisp.net/project/anaphora/ – PuercoPop

相關問題