我们应该如何称呼在 clojure prog 中声明的对象?

What should we call an object declared in a clojure prog?

当我们谈论 clojure(或其他 lisp)程序时,当引用其中声明的对象时我们应该怎么说?例如:

(let [a ...

当然,如果a是一个函数,我们说function a,但是当它不是一个函数的时候我们应该怎么说呢? 表格? 数据符号文字?

一般来说,我们用其他编程语言说这些东西 变量对象

a 始终是一个符号,独立于绑定到它的值(无论是函数、数字还是其他任何东西)

之前有一个关于 Clojure 符号的回答,可以在这里更清楚地说明问题:Symbols in Clojure

记住symbols are not the same thing as vars

let 特殊形式在 symbol(s)value[= 之间创建 bindings 21=]。

let actually uses the vocabulary and wording that you are looking for and should use, specifically the Binding Forms 部分的官方文档更加阐明了主题:

The basic idea is that a binding-form can be a data structure literal containing symbols [or just a single symbol] that get bound to the respective parts of the init-expr.

我认为这个问题混淆了两件事,或者至少没有说清楚它们的不同。

正如到目前为止的其他答案所指出的,“a”是一个符号,它的计算结果是别的东西。所以当我们谈论 a 时,我们可能指的是符号,或者其他东西。我们甚至可以说 var 是符号和其他东西之间的中介。 (有关 var/symbol 关系的更多信息,请参阅 Guillermo Winkler 链接的页面,我将把它留在后台。)

符号永远不是函数,但它可以有一个函数作为它的值。当你调用一个函数时,你只是以一种特殊的方式使用它的值。您甚至可以将内置函数的值设置为其他值:

(def + -)
WARNING: + already refers to: #'clojure.core/+ in namespace: user, being replaced by: #'user/+
#'user/+
user=> (+ 5 2)
3
user=> (def - "This used to be the minus function")
WARNING: - already refers to: #'clojure.core/- in namespace: user, being replaced by: #'user/-
#'user/-
user=> -
"This used to be the minus function"

我把+的值给了-,然后把-的值变成了一个字符串。 (是的,有警告,但它起作用了。)函数只是符号的值这一事实是 Clojure 与许多其他语言的不同之处。 (方案相似。Common Lisp 相似,但方式更复杂。)

所以符号只是符号。它通常有一个值,可以是一个函数,或者一个数字,或者一个字符串,或者一个关键字,或者任何可以在 Clojure 中作为值的东西——向量、惰性序列、列表(可能是 Clojure 代码),甚至另一个符号(甚至是同一个符号:(def a 'a).)如果在特定上下文中有用,您可以将其中一些东西称为数据。在 Clojure 中将函数描述为数据有时是合理的。

(def add-fns [#(+ 1 %) #(+ 2 %) #(+ 3 %)]) ;=> #'user/add-fns

add-fns ;=> [#object[user$fn__1178 0x71784911 "user$fn__1178@71784911"] #object[user$fn__1180 0x45ed957d "user$fn__1180@45ed957d"] #object[user$fn__1182 0x7838c8c5 "user$fn__1182@7838c8c5"]]

add-fns 是一个函数向量。我们应该怎么称呼作为向量元素的函数?如果我们像数据一样使用它们,它们在某种意义上不是数据吗?我们可以在它们上面映射一个函数,或者对它们重新排序,例如:

(map #(% 10) add-fns) ;=> (11 12 13)

(map #(% 10) (reverse add-fns)) ;=> (13 12 11)

这些表达式中的每一个都接受 add-fns 中的每个函数,并以 10 作为参数调用它,按顺序返回结果。

异常:宏不遵循相同的规则:

user=> and
CompilerException java.lang.RuntimeException: Can't take value of a macro: ...

一些 Java 互操作技巧也不遵循相同的规则。