Скобки внутри анонимной функции с вектором в качестве параметра - PullRequest
3 голосов
/ 01 июня 2011

Я все еще изучаю уловку и у меня есть сомнения

когда я пишу анонимную функцию, я делаю это

fn [parameter] 
 (do something)

ок ... тело функции заключено в набор скобок

сейчас я читаю решение Фибоначчи, как это

(iterate (fn [[a b]] [b (+ a b)]) [0 1]))

я сомневаюсь, почему это не так

(iterate (fn [[a b]]  (    [b (+ a b)]   ))   [0 1]))

Я прилагаю функцию с ()

(iterate (fn [[a b]]   "("    [b (+ a b)]   ")"  )   [0 1]))

он получает вектор и затем возвращает функцию тела, чем другой вектор ...

Другое дело, когда я вызываю функцию с векторным параметром или я делаю большую ошибку.

Ответы [ 2 ]

8 голосов
/ 01 июня 2011

Если функция возвращает вектор, вам не нужно оборачивать ее чем-либо, просто верните вектор в скобках. Тело функции не обязательно «заключено» в скобки, оно просто очень распространено, потому что обычно функции делают несколько вещей перед возвратом значения, что включает использование скобок.

Так что, если вы просто возвращаете вектор из функции, «тело» функции может быть [foo,bar,baz]. Если вы возвращаете карту, тело функции может быть {:a foo, :b bar, :c baz}. Если вы возвращаете одно значение, это может быть один символ.

Единственное, что "заключено" в круглые скобки - это само определение функции, будь то (fn [] ...), #(...) или (defn [] ...).

Еще одно примечание: скобки и скобки [, ], { и } на самом деле являются просто синтаксическим сахаром для функций (vector) и (hash-map) соответственно, поэтому [1,2,3] - это такой же как (vector 1 2 3) и {:a foo, :b bar} такой же как (hash-map :a foo :b bar). Если это поможет вам увидеть тела функций, «обернутые» в скобках, вы можете использовать более длинные имена функций, чтобы возвращать векторные и картографические типы данных Clojure, но использование скобок и скобок гораздо более идиоматично.

1 голос
/ 05 июня 2011

Возможно, в более простых словах, чем Семпер, [1 2 3] является сокращением / эквивалентом для (вектор 1 2 3), так что скобки здесь! Аналогично для {: a 1: b 2}, что эквивалентно (hash-map: a 1: b 2).

То, что я не посмотрел, но может быть интересно покопаться в исходном коде для читателя clojure и посмотреть, действительно ли он заменяет что-либо в [..] на (вектор ...) или использует какой-то другой трюк: -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...