Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模拟Java属性文件的语法,Scheme和Clojure都可以读取?_Java_Clojure_Scheme - Fatal编程技术网

模拟Java属性文件的语法,Scheme和Clojure都可以读取?

模拟Java属性文件的语法,Scheme和Clojure都可以读取?,java,clojure,scheme,Java,Clojure,Scheme,作为的延续,我正在研究一个Java属性文件“replacement”,它可以包含普通Java字符串之外的代码。Java属性文件如下所示: key1=value1 key2=value2 ... 为了好玩,我正在玩一个老的JScheme(由于大小的原因),但我想到了一个与Clojure兼容的文件格式会很有用。这将允许在使用Clojure的小型“读取我的配置”用法以及大型系统中使用相同的语法。这样一来,就可以对值进行求值,而不仅仅是静态字符串 我对Scheme或Clojure不是很有经验,但两者似

作为的延续,我正在研究一个Java属性文件“replacement”,它可以包含普通Java字符串之外的代码。Java属性文件如下所示:

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”)是否可行?