关于执行顺序的问题

Questions about Execution Order

我正在尝试学习 Common Lisp,并在 repl 中尝试一些东西时发现了一些意想不到的东西(对我来说)。基于大多数编程语言的执行顺序,以及我一直从 lisp 听说的第一个 class 函数支持,我认为以下应该可行:

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

在Ruby我能做到:

if true
  Object.method(:puts)
end.call("test")

我对上面的 lisp 代码应该如何工作的想法是,它应该评估内部 lisp 形式,return 格式,然后开始评估外部 lisp 形式,format 然后是第一个原子。我读到第一个形式需要是一个符号,所以我也尝试了 ((if t format) t "test"),尽管我最初的想法是这会尝试在从内部形式 returning 之前评估格式。

我注意到有时 lisp 形式需要在 #' 前面加上 #' 才能调用它们的结果,但是使用 (#'(if t 'format) t "test") 也不起作用。我确定我只是误解了一些基本的东西,因为我是 lisp 的新手,但这是怎么回事?

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

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

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

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

您尝试的方法在其他一些 Lisp 方言中也适用,例如 Scheme。