Вы используете apply
для преобразования функции, которая работает с несколькими аргументами, в функцию, которая работает с одной последовательностью аргументов. Вы также можете вставить аргументы перед последовательностью. Например, map
может работать с несколькими последовательностями. Этот пример (из ClojureDocs ) использует map
для транспонирования матрицы.
user=> (apply map vector [[:a :b] [:c :d]])
([:a :c] [:b :d])
Один вставленный аргумент здесь vector
. Таким образом, apply
расширяется до
user=> (map vector [:a :b] [:c :d])
Cute!
PS Чтобы вернуть вектор векторов вместо последовательности векторов, оберните все это в vec
:
user=> (vec (apply map vector [[:a :b] [:c :d]]))
Пока мы здесь, vec
можно определить как (partial apply vector)
, хотя это не так.
Относительно Lisp-1 и Lisp-2: 1 и 2 указывают количество вещей, которые имя может обозначать в данном контексте. В Lisp-2 вы можете иметь две разные вещи (функцию и переменную) с одним и тем же именем. Так что, где бы ни было допустимо какое-либо значение, вам нужно украсить вашу программу чем-то, чтобы указать, что вы имеете в виду. К счастью, Clojure (или Схема ...) позволяет имени обозначать только одну вещь, поэтому такие украшения не нужны.