Lisp noob在这里.
CL-USER> (defun my-if (a b c)
(cond (a b)
(t c)))
CL-USER> (my-if t (print 1) (print 2))
1
2
1
Run Code Online (Sandbox Code Playgroud)
我没想到得到2,因为cond如果第一个为真,则不应该评估第二个子句:
CL-USER> (cond (t (print 1))
(t (print 2)))
1
1
Run Code Online (Sandbox Code Playgroud)
这是为什么我们需要宏,还是我犯了其他错误?
在进入函数之前,会评估Common Lisp中函数的参数.当(print 1)被评价它打印1并返回1.当(print 2)被评价它打印2并返回2.1并2进入功能.它1作为答案返回.
要做你想做的事,你需要写一个宏:
CL-USER> (defmacro my-if (a b c)
`(cond (,a ,b)
(t ,c)))
MY-IF
CL-USER> (my-if t (print 1) (print 2))
1
1
Run Code Online (Sandbox Code Playgroud)
由于函数的参数都得到了评估,因此需要延迟/强制评估:
CL-USER 35 > (defun my-if (condition then-thunk else-thunk)
(cond (condition (funcall then-thunk))
(t (funcall else-thunk))))
MY-IF
CL-USER 36 > (my-if t
(lambda () (print 1))
(lambda () (print 2)))
1
1
CL-USER 37 > (my-if nil
(lambda () (print 1))
(lambda () (print 2)))
2
2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
183 次 |
| 最近记录: |