Clojure:符号标准数据类型是否来自不同clj fies的函数之间?

时间:2012-03-21 05:38:59

标签: exception clojure symbols

我有一个程序,包装,在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")
)

逻辑有效,但程序一旦到达“开始”调用就会崩溃......这让我觉得,由于某种原因,'(abc)中的符号“b”与b不匹配正在调用的程序中声明(即我未在此处显示的程序)。

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

2 个答案:

答案 0 :(得分:4)

你的程序如何崩溃?

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

您在此处显示的程序不是有效的clojure。你使用sharp(#)作为评论字符的开头,但事实并非如此。你应该使用分号。

其他一些小问题:

  • 您不需要引用地图,也不需要评估
  • 您可以使用集合代替(在?'(a b c)(ops输入)),如下所示:(#{a b c}(ops input))。
  • 更快,更惯用

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

答案 1 :(得分:-2)

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

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

除非a,b,c符号与别处的字符串绑定?