我们应该如何称呼在 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 互操作技巧也不遵循相同的规则。
当我们谈论 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 互操作技巧也不遵循相同的规则。