iCo*_*ime 2 lisp sbcl common-lisp
我正在尝试学习Common Lisp,并在repl中尝试一些东西时发现了意想不到的东西(对我而言).基于大多数编程语言中的执行顺序,以及我从lisp一直听到的一流的功能支持,我认为以下应该有效:
((if t 'format) t "test")
Run Code Online (Sandbox Code Playgroud)
在Ruby中我可以做到:
if true
Object.method(:puts)
end.call("test")
Run Code Online (Sandbox Code Playgroud)
我对上述lisp代码应该如何工作的思考是它应该评估内部lisp表单,返回格式,然后开始评估外部lisp表单,format
然后是第一个原子.我读过第一个表单需要是一个符号,所以我也试过((if t format) t "test")
,尽管我最初的想法是,这会尝试在从内部表单返回之前评估格式.
我注意到有时候需要先输入lisp表单#'
才能使结果可以调用,但是使用(#'(if t 'format) t "test")
也不起作用.我确信我只是误解了一些基本的东西,因为我对lisp很新,但是这里发生了什么?
Common Lisp通常不会计算表达式的第一个元素.它必须是命名函数的文字符号或lambda表达式.
如果要调用动态确定的函数,则需要使用以下FUNCALL
函数:
(funcall (if t 'format) t "test")
Run Code Online (Sandbox Code Playgroud)
这类似于.call()
在Ruby中使用该方法的需要.
您尝试过的方法可以用于其他一些Lisp方言,例如Scheme.