模拟Java属性文件的语法,Scheme和Clojure都可以读取?
作为的延续,我正在研究一个Java属性文件“replacement”,它可以包含普通Java字符串之外的代码。Java属性文件如下所示:模拟Java属性文件的语法,Scheme和Clojure都可以读取?,java,clojure,scheme,Java,Clojure,Scheme,作为的延续,我正在研究一个Java属性文件“replacement”,它可以包含普通Java字符串之外的代码。Java属性文件如下所示: key1=value1 key2=value2 ... 为了好玩,我正在玩一个老的JScheme(由于大小的原因),但我想到了一个与Clojure兼容的文件格式会很有用。这将允许在使用Clojure的小型“读取我的配置”用法以及大型系统中使用相同的语法。这样一来,就可以对值进行求值,而不仅仅是静态字符串 我对Scheme或Clojure不是很有经验,但两者似
key1=value1
key2=value2
...
为了好玩,我正在玩一个老的JScheme(由于大小的原因),但我想到了一个与Clojure兼容的文件格式会很有用。这将允许在使用Clojure的小型“读取我的配置”用法以及大型系统中使用相同的语法。这样一来,就可以对值进行求值,而不仅仅是静态字符串
我对Scheme或Clojure不是很有经验,但两者似乎都有vector
,但简捷的语法不同(#(…)
与[…]
)
是否存在表示“Java属性”数据结构的语法,该数据结构是有效的Scheme和Clojure程序?请出示实际代码
编辑:在看了
(道具…
的建议并用ELisp和JScheme进一步复习了我的Lisp技能之后,我发现
(list
"key1" "value1"
"key2" "value"
)
使用离属性文件不太远的语法可能是实现这一点的最简单方法 假设您不想创建scheme reader宏来读取clojure映射文本(并且clojure不支持自定义读取器宏),那么定义一个“props”函数如何:
(props 'key1 value1 'key2 value2 ...)
现在在clojure中,将道具定义为
(def props hash-map)
同样地,在scheme中,您可以用任何一种语言计算props表达式
你可以让道具更时髦一点,让道具成为引用按键的宏(假设按键是符号),或者让它保持原样,以获得更大的灵活性为代价,而不必引用按键。假设你想与Clojure兼容,我认为模拟Java属性文件的最佳结构和格式可能就是使用标准的Clojure映射语法 优点:
- 它非常类似于JSON,是一种通用且灵活的格式
- 您可以直接通过Clojure阅读器(带或类似)阅读。不需要编写任何解析器李>
- 您还可以在数据结构中包含Clojure代码,Clojure阅读器可以读入并编译这些代码(但如果这样做,请小心代码注入攻击!)
- 作为一个不可变的持久数据结构,您可以从中获得所有好处
{:key1 "Value1"
:key2 "Value2"
:function (fn [x] (* x x))}
您可以使用任何您喜欢的对象作为键(例如字符串),尽管我个人认为使用关键字(例如以冒号开头的符号)最容易。关键字有一些很好的优点,因为它们是可靠的,你可以将它们用作从地图中获取其价值的函数,例如
(:key2 property-map)
=> "Value2"
实现这一点最简单、最方便的方法是使用一个好的、老式的列表S表达式。使用(Scheme)或(Clojure)进行书写,使用
读取(和)进行阅读。(无需使用eval
)
您的示例如S表达式所示:
("key1" "value1"
"key2" "value2")
S表达式非常灵活。它们可以任意嵌套,并且可能包含字符串以外的对象。例如,如果键是语义结构字段(类似于XML元素名称),符号可能比字符串更适合这些字段,如下所示:
(game
(players (name "Alice" score 5)
(name "Bob" score 10)
(name "Catherine" score 20))
(state 4321))
如问题中所述,我使用JScheme。键可能包含句点和/或我认为符号中不允许使用的其他字符。(道具“key1”“value1”“key2”“value2”)是否可行?