Exception Clojure:符号是不同clj函数之间传递的标准数据类型吗?

Exception Clojure:符号是不同clj函数之间传递的标准数据类型吗?,exception,clojure,symbols,Exception,Clojure,Symbols,我有一个正在包装的程序,用clojure 程序有一些用于启动的符号作为输入 我创建了一个简单的UI,可以使用映射将用户输入的字符串转换为符号 #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

我有一个正在包装的程序,用clojure

程序有一些用于启动的符号作为输入

我创建了一个简单的UI,可以使用映射将用户输入的字符串转换为符号

#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")
)
然而,逻辑是有效的,程序一旦到达“开始”调用就会崩溃。。。这使我认为,出于某种原因,(abc)中的符号“b”与正在调用的程序中声明的b不匹配(即,我在这里没有显示的程序)


很明显,这个问题是无趣的,所以我真正的问题是:我应该把字符串解析成符号,然后作为控制结构发送给另一个程序吗?或者有没有更好的方法来调用使用原始符号作为内部输入的外部clj脚本。我将感谢任何关于为什么程序崩溃的细节。。。但由于我没有提供太多的代码,我不希望任何人能够神奇地“知道”这里的错误在任何详细的意义上

您可能希望在该列表中包含字符串

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

除非a、b、c符号绑定到其他地方的字符串?

您的程序是如何崩溃的

符号属于名称空间,如果不考虑这一点,最终可能会比较具有相同名称的不同符号。在您的情况下,您可能更喜欢使用关键字(以冒号“:keyword”开头)

你在这里展示的程序不是有效的clojure。您正在使用sharp(#)作为注释的开头字符,但它不是。你应该用分号来表示

其他一些要点:

  • 你不需要引用地图,它不会被评估
  • 您可以使用集合代替(在?'(abc)(ops输入))如下:(#{abc}(ops输入))。它更快,更地道

更新:通常,clojure中的符号不属于名称空间(请参阅注释)。

为什么?(ops“boat”)的计算结果是符号b,而不是字符串“b”。因为地图将sting链接到符号-{“boat”b},我仍然不明白你的意思。在AFAICT中,OP希望将输入字符串映射到符号以便于比较,他的映射就是这样做的。是的,但是读取行返回一个字符串?我认为他的意思是使用关键词而不是符号?如果
{“boat”b}
没有被引用,那么
b
将被评估。此外,符号不属于名称空间,除非它们放在那里(例如,通过被准引用)。@MatthiasBenkard我假设这只是文件的一部分(不是全部),我还假设OP将名称空间声明放在顶部。也许我想得太多了?在任何情况下,比较来自不同名称空间的符号似乎是最可能的问题(除了#符号之外),名称空间声明不会改变文字符号默认不具有名称空间的事实。尝试:将
(ns eu.mulk.foo)(def x'hello)(println(namespace x))
放入一个文件并加载该文件。结果将打印出
nil
。Clojure处理实习的方式不同于普通的Lisp和相关方言。@MatthiasBenkard谢谢!我真的在想象常见的类似Lisp的名称空间,而不是
{“boat”b}
,你应该有
{“boat”b}
——你不想引用整个地图,只想引用符号
b
@MattFenwick,它们的计算结果是相同的(尽管
{“boat”b}
可能更惯用,也可能不太惯用)。