>>> a = [(1, 2), (3, 4), (5, 6)]
>>> reduce(tuple.__add__, a)
>>> (1, 2, 3, 4, 5, 6)
Или, чтобы быть агностиком о типе внутренних последовательностей (как долго, поскольку они являются всеми одинаковыми):
>>> reduce(a[0].__class__.__add__, a)
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
Лексическое и динамическое связывание:
привязка
связывает значение с именем в глобальной среде для каждого потока
Как вы упомянули, let
создает новую область для указанных привязок.