Clojure: первая функция и отметки - PullRequest
0 голосов
/ 28 февраля 2020
(ns main.core)

(defn andexp [& resty]
  (println "here is resty:" resty)
  (first (resty))
)

Я очень новичок в Clojure из Java и C фона. В ответе вход должен быть в следующем формате:

(andexp '(John is a beginner so have mercy))

I need , чтобы включить галочку ('). Я хочу, чтобы моя программа распечатала «Джон».

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Здесь происходит две вещи:

Вы используете & resty для деструктурирования списка всех аргументов; вот почему вы видите вывод ((John ...)) (обратите внимание на двойной (()).

Далее вы вызываете resty, когда вы пишете (resty), что приводит к ошибка (запомните, парни в clojure всегда значимы, и не только для группировки вещей togehter et c. как в языках с фигурными скобками).

Так что это будет делать то, что вы хотите:

repl=> (defn andexp [resty]
         (println "here is resty:" resty)
         (first resty))
#'repl/andexp
repl=> (andexp '(a b c))
here is resty: (a b c)
a

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

repl=> (defn andexp [[f & resty]]
         (println "here is f and resty:" f resty)
         (first resty))
#'repl/andexp
repl=> (andexp '(a b c))
here is f and resty: a (b c)
b

Больше информации о деструктурирующий

0 голосов
/ 28 февраля 2020

Если вы напишите это так:

(defn andexp
  [& resty]
  (println "here is resty:" resty)
  (first resty))

, вы получите результат:

(andexp '(John is a beginner so have mercy))  #=>

    here is resty: ((John is a beginner so have mercy))
    (John is a beginner so have mercy)

, но вы, вероятно, хотели что-то похожее на это:

(defn andexp
  [& resty]
  (println "here is resty:" resty)
  (first resty))

(println :result (andexp  1 2 3 4) )  ; no wrapping parens

с результатом:

here is resty: (1 2 3 4)
:result 1

Другой вариант:

(defn andexp
  [& resty]
  (println "here is resty:" resty)
  (first (first resty))) ; or `ffirst`

(println :result (andexp [1 2 3 4]) )

с результатом:

here is resty: ([1 2 3 4])
:result 1

Это может помочь уточнить ответ, если вы добавьте больше информации о прецеденте или цели.


Для справки см. документацию, указанную здесь:

https://github.com/io-tupelo/clj-template#documentation

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