Clojure (карта) поверх ключей карты

У меня есть карта от ключевых слов до строк направления компаса:

(def dirnames {:n "North", :s "South", :e "East", :w "West"})

Я могу искать имена, используя карту как функцию:

(dirnames :n)
;# = "North"

Мне кажется, что

(map dirnames [:n :s])

должен вернуть вектор

["North" "South"]

но он возвращается

[:n :s]

вместо. Я пробовал это полдюжины способов, предоставляя различные функции вместо «dirnames» в вызове (map), и я всегда возвращал вектор ключевых слов.

Очевидно, я упускаю что-то основное. Что это?


person Will    schedule 20.05.2014    source источник
comment
Какие версии Clojure? Я пробовал только в 1.4.0 и 1.5.1, и оба они делают то, что вы хотите, то есть (map dirnames [:n :s]) оценивается как ("North" "South"). Или замените map на mapv и вы получите ["North" "South"].   -  person Omri Bernstein    schedule 21.05.2014
comment
Я работал над этим в Light Table; и я вижу результаты выше в InstaREPL Light Table. Я вижу правильное поведение, если запускаю REPL как java -cp clojure.jar clojure.main.   -  person Will    schedule 21.05.2014
comment
Кажется, это проблема со световым столом.   -  person Will    schedule 21.05.2014
comment
Ах, ну, я не могу вам помочь :/ Я не использую Light Table.   -  person Omri Bernstein    schedule 21.05.2014
comment
Попросив Light Table оценить весь модуль с нуля, похоже, проблема решена.   -  person Will    schedule 21.05.2014


Ответы (2)


У меня работает, я неправильно понимаю вопрос:

user> (def dirnames {:n "North", :s "South", :e "East", :w "West"})\
#'user/dirnames

user> (map dirnames [:n :s])
("North" "South")

также:

user> (map #(dirnames %) [:n :s])
("North" "South")
user> (mapv #(dirnames %) [:n :s])
["North" "South"]
person Arthur Ulfeldt    schedule 20.05.2014
comment
Неправильная проблема, хотя я рад узнать о (mapv). Проблема не в том, получаю ли я последовательность или вектор, а в том, что я возвращал не строки, а ключевые слова. - person Will; 21.05.2014

Бьюсь об заклад, вы забыли некоторые скобки. Рассмотрим это определение функции:

(defn foo [dirnames]
  map dirnames [:n :s])

Это выглядит почти правильно, но он оценивает map для побочных эффектов, затем dirnames для побочных эффектов (оба они ничего не делают), а затем, наконец, возвращает [:n :s]. Это единственное разумное объяснение, которое я могу придумать для поведения, подобного тому, что вы описываете.

person amalloy    schedule 21.05.2014
comment
Оказывается, код был правильным, но я перепутал REPL, с которым работал. Я думаю, что вар был связан иначе, чем я думал. Хороший урок. - person Will; 21.05.2014
comment
Хорошее предположение для этого вопроса. - person johnbakers; 25.05.2014