Clojure: Являются ли символы стандартным типом данных для передачи между функциями из разных областей? - PullRequest
1 голос
/ 21 марта 2012

У меня есть программа, которую я упаковываю в clojure.

Программа имеет несколько символов, которые она использует для запуска, в качестве ввода.

Я создал простой пользовательский интерфейс для преобразования введенных пользователем строк в символы с помощью карты.

#expect user to enter "boat" 
(def input (read-line))

(def ops '{"boat" b})

(if 
  # check if the value of the key is a valid symbol
  (in? '(a b c) (ops input))

  #if so , run class
  (start (ops input))

  #end
  (print "didnt find " input " in options , fail.\n")
)

Логика работает, однако, программа падает, как только она достигает вызова "start" ... Это заставляет меня думать, что по какой-то причине символ "b" в '(abc) нене совпадают с b, как заявлено в вызываемой программе (то есть той, которую я здесь не показал).

Совершенно очевидно, что эта проблема неинтересна, поэтому мой реальный вопрос:разбирать строки на символы, которые я посылаю в качестве управляющих структур в другую программу?Или есть лучший способ вызвать внешний сценарий clj, который использует необработанные символы в качестве внутренних входных данных.Я был бы признателен за любую конкретную информацию относительно причины сбоя программы ... но, поскольку я не предоставил много кода, я не ожидаю, что кто-либо сможет волшебным образом "знать", что здесь не так, в каком-либо подробном смысле.

Ответы [ 2 ]

4 голосов
/ 21 марта 2012

Как происходит сбой вашей программы?

Символы принадлежат пространствам имен, и если вы не примете это во внимание, вы можете сравнить различные символы с одним и тем же именем.В вашем случае вы можете вместо этого использовать ключевые слова (начиная с двоеточия, например ": ключевое слово").

Программа, которую вы показываете здесь, не является допустимым clojure.Вы используете Sharp (#) в качестве символа начала комментария, но это не так.Для этого вы должны использовать точку с запятой.

Некоторые другие незначительные пункты:

  • Вам не нужно указывать карту, она не оценивается
  • Вы можете использовать наборывместо (in? '(abc) (ops input)) вот так: (# {abc} (ops input)).Это быстрее и более идиоматично

Обновление: Как правило, символы в clojure не принадлежат пространствам имен (см. Комментарии).

0 голосов
/ 21 марта 2012

Возможно, вы хотите, чтобы в этом списке были строки

'("a" "b" "c")

если символы a, b, c не связаны со строками где-либо еще?

...