关于执行订单的问题

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很新,但是这里发生了什么?

Bar*_*mar 8

Common Lisp通常不会计算表达式的第一个元素.它必须是命名函数的文字符号或lambda表达式.

如果要调用动态确定的函数,则需要使用以下FUNCALL函数:

(funcall (if t 'format) t "test")
Run Code Online (Sandbox Code Playgroud)

这类似于.call()在Ruby中使用该方法的需要.

您尝试过的方法可以用于其他一些Lisp方言,例如Scheme.