Как тебя зовут?" аргумент в клоюре? - PullRequest
3 голосов
/ 13 июня 2019

Я читаю книгу Расса Олсена "Getting Clojure".В главе 8 «Определение, символы и переменные» приведено следующее определение функции:

(def second (fn second [x] (first (next x))))
                ^^^^^^

Мой вопрос касается подчеркнутого second, который идет вторым.

ВВо-первых, я думал, что этот синтаксис неправильный, поскольку анонимным функциям не нужно имя.Но , как выясняется, , этот синтаксис правильный.

Usage: (fn name? [params*] exprs*)
       (fn name? ([params*] exprs*) +)

Я попытался сравнить следующие два вызова функции.

user> (fn second [x] (first (rest x)))
#function[user/eval5642/second--5643]
user> (fn [x] (first (rest x)))
#function[user/eval5646/fn-5647]

Помимо имени функции, похоже, что нет никакой разницы.

Зачем нужен аргумент name? для fn?

Ответы [ 2 ]

5 голосов
/ 13 июня 2019

Вы можете использовать его при создании нескольких арностей:

(fn second
      ([x] (second x 1))
      ([x y] (+ x y)))

или если вам нужно сделать рекурсивный вызов:

(fn second [x] (when (pos? x)
                  (println x)
                  (second (dec x))))
4 голосов
/ 13 июня 2019

Существует два основных способа использования:

  • рекурсивные функции (теперь вы знаете имя)
user=> ((fn foo [x] (when (pos? x) (println x) (foo (dec x)))) 3)
3
2
1
nil

  • улучшенные трассировки стека (имя даст вамлучший совет, где все пошло не так)
user=> (map (fn bar [x] (inc x)) ["a"])
Error printing return value (ClassCastException) at clojure.lang.Numbers/inc (Numbers.java:137).
java.lang.String cannot be cast to java.lang.Number
user=> (pst)
ClassCastException java.lang.String cannot be cast to java.lang.Number
      clojure.lang.Numbers.inc (Numbers.java:137)
      user/eval8020/bar--8021 (NO_SOURCE_FILE:1)
      clojure.core/map/fn--5866 (core.clj:2753)
      clojure.lang.LazySeq.sval (LazySeq.java:42)
      clojure.lang.LazySeq.seq (LazySeq.java:51)
      clojure.lang.RT.seq (RT.java:535)
      clojure.core/seq--5402 (core.clj:137)
      clojure.core/seq--5402 (core.clj:137)
      puget.printer.PrettyPrinter (printer.clj:529)
      puget.printer/iseq-handler--1663 (printer.clj:314)
      puget.printer/iseq-handler--1663 (printer.clj:312)
      puget.printer/format-doc* (printer.clj:223)

(примечание user/eval8020/bar--8021)

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