2013-06-06 2 views
4

Может кто-нибудь объяснить мне, почемуОпределение функции с «дополнительным» скобкой

((fn ([x] x)) 1) 

работы и возвращает 1? (Есть один «лишний» набор скобок после fn) Не должно ли оно быть следующим?

((fn [x] x) 1) 

Кроме того,

((fn (([x] x))) 1) 

(2 "лишние" наборы скобок) не с "CompilerException System.ArgumentException: декларации параметров ([х] х) должен быть вектор". Зачем?

Спасибо!

ответ

10

Дополнительный набор круглых скобок позволяет определить функцию с переменным числом аргументов. Следующий пример определяет функцию, которая может принимать либо один аргумент или два аргумента:

(defn foo 
    ([x] x) 
    ([x y] (+ x y))) 

Вы можете увидеть это как определение две функции под одним именем. Соответствующая функция будет вызываться в зависимости от количества аргументов, которые вы предоставляете.

Если определить функцию с фиксированным числом аргументов, следующие две формы эквивалентны:

(defn bar ([x] x)) 

и

(defn baz [x] x) 

Имея это в виду, вы можете понять, компилятор исключение. Вы пытаетесь определить функцию следующим образом:

(defn qux 
    (([x] x))) 

При использовании дополнительного набора скобок, закрытие ожидает первый элемент внутри parenthsesis быть вектором (в скобках). Однако в этом случае первым элементом является ([x] x), который является списком, а не вектором. Это ошибка, которую вы получаете.

+0

Спасибо! Я полностью забыл об этой возможности :) – Anonymous

Смежные вопросы