Позвольте по сравнению с привязкой в Clojure

>>> a = [(1, 2), (3, 4), (5, 6)]
>>> reduce(tuple.__add__, a)
>>> (1, 2, 3, 4, 5, 6)

Или, чтобы быть агностиком о типе внутренних последовательностей (как долго, поскольку они являются всеми одинаковыми):

>>> reduce(a[0].__class__.__add__, a)
68
задан Prince John Wesley 21 October 2012 в 02:50
поделиться

2 ответа

let создает неизменяемый псевдоним с лексической областью видимости для некоторого значения. привязка создает привязку с динамической областью видимости для некоторой Var .

Динамическое связывание означает, что код внутри вашей формы связывания и любой код, который вызывает этот код (даже если он не находится в локальной лексической области видимости), увидят новую привязку.

Дано:

user> (def ^:dynamic x 0)
#'user/x

привязка фактически создает динамическую привязку для Var , но let затеняет переменную только локальным псевдонимом:

user> (binding [x 1] (var-get #'x))
1
user> (let [x 1] (var-get #'x))
0

привязка может использовать квалифицированные имена (поскольку она работает на Var s) и let не может:

user> (binding [user/x 1] (var-get #'x))
1
user> (let [user/x 1] (var-get #'x))
; Evaluation aborted.
;; Can't let qualified name: user/x

let -введенные привязки не изменяются. Связывание -введенное связывание является изменяемым локально в потоке:

user> (binding [x 1] (set! x 2) x)
2
user> (let [x 1] (set! x 2) x)
; Evaluation aborted.
;; Invalid assignment target

Лексическое и динамическое связывание:

106
ответ дан 24 November 2019 в 14:15
поделиться

привязка связывает значение с именем в глобальной среде для каждого потока

Как вы упомянули, let создает новую область для указанных привязок.

9
ответ дан 24 November 2019 в 14:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: