Clojure:基本术语的定义

Clojure: Definitions of basic terms

在 Clojure 上下文中,有些人将术语 form 定义为“任何有效代码”,有些人将其定义为“returns 一个值的任何有效代码”。所以数字 1729 和字符串 Hello! 都是一种形式。同样 (fn 不是一种形式。未定义的符号,比如说 my-val,是一种形式吗?

表达式和形式有什么区别?

表达式和函数有什么区别?

What is the difference between an expression and a form?

在我看来,form 在 Clojure 的上下文中是编译器处理的事情。有些形式是有效的表达式,而其他形式是 "special" 形式(即宏)。

What is the difference between an expression and a function?

任何函数都是表达式。

Is an undefined symbol, say my-val, a form?

我会说这是一个产生编译时异常的有效表达式(因此形成)。

Likewise (fn) is not a form

您似乎指的是某个声明来源,您能提供一个 link 吗?

这个问题在 Are Lisp forms and Lisp expressions same thing?

上有一些很好的答案

要考虑的关键是生命周期中有不同的点。我们从文本 "(+ 1 2)" 开始,然后将 read 转换为 Clojure 数据(包含一个符号和两个数字的列表)。通常在 Lisps 中,"expression" 用于表示前者,而 "form" 用于表示后者。在实践中,我发现人们并不完全同意这种用法,并且经常将这两个术语用于两种事物。

如果把"form"表示为"something which can be evaluated",那么1729或者"Hello!"或者符号my-val都是形式。当 my-val 被评估时,它在当前命名空间中被解析,可能是一个可调用的函数实例。函数只有在评估时才真正重要,当它们可以被调用时。

另一个有趣的方面是宏,它允许您创建新的语法。请注意,宏扩展发生在 after 阅读之后,这意味着虽然您可以创建新语法,但它仍然必须遵循编码到 reader 中的一些基本期望(即调用遵循模式 (<invokable> <args...>))。请注意,宏适用于已读但未评估的表单(数据,而不是文本)并且必须生成新表单。