关于执行顺序的问题
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。
我正在尝试学习 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。