我正在尝试学习Common Lisp,并在repl中尝试某些东西时发现了一些(对我而言)意外的东西。基于大多数编程语言中的执行顺序,以及我一直从lisp听到的一流的一流功能支持,我认为以下方法应该有效:
((if t 'format) t "test")
在Ruby中,我可以这样做:
if true
Object.method(:puts)
end.call("test")
我对上面的lisp代码如何工作的思考是,它应该评估内部lisp形式,返回格式,然后开始评估外部lisp形式,其中format
是第一个原子。我已经读过,第一种形式必须是符号,因此即使我最初的想法是在从内部形式返回之前尝试评估格式,我也尝试了((if t format) t "test")
。
我注意到,有时Lisp格式必须在#'
之前才能使其结果可调用,但是使用(#'(if t 'format) t "test")
也不起作用。我肯定我只是误解了一些基本知识,因为我对Lisp相当陌生,但是这里发生了什么?
答案 0 :(得分:8)
Common Lisp通常不会评估表达式的第一个元素。它必须是为函数命名的文字符号或lambda表达式。
如果要调用动态确定的函数,则需要使用FUNCALL
函数:
(funcall (if t 'format) t "test")
这类似于在Ruby中使用.call()
方法的需求。
您尝试过的方法可以在其他Lisp方言中使用,例如Scheme。