关于执行命令的问题

时间:2018-06-29 23:19:57

标签: lisp common-lisp sbcl

我正在尝试学习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相当陌生,但是这里发生了什么?

1 个答案:

答案 0 :(得分:8)

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

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

(funcall (if t 'format) t "test")

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

您尝试过的方法可以在其他Lisp方言中使用,例如Scheme。