(免责声明:我是C#家伙.我刚开始学习Clojure.)
我知道Clojure 程序有能力操纵自己或轻松生成其他程序.它与Clojure中的所有内容有关,它是一种数据结构,生成程序与创建任何其他类型的数据结构相同.
有没有人有一个很好的示例程序(或一个参考)显示这个?
如果生成程序,是否可以将该程序"序列化"到磁盘以供以后执行?
仅供参考:
我正在尝试使用遗传编程.我想生成很多小程序,评估它们,并使用成功的程序来生成更多程序.在这里和这里看到更多.
我想我在这里滥用条款.通过程序,我实际上是指一个clojure列表,而代码生成我的意思是"列表生成".我只需要列表来包含实际的函数调用和参数.我需要能够控制此列表何时"执行".
Brian Carper.. 28
考虑(+ 1 2)
.作为数据,它是三个项目的链表:符号+
和两个整数.作为代码,它是一个函数调用,说"调用+
用这两个整数作为参数调用的函数并给我结果".您可以对此列表执行任何操作,您可以对任何其他数据列表执行任何操作.你也eval
可以得到一个结果.
user> (def x '(+ 1 2)) #'user/x user> (first x) + user> (rest x) (1 2) user> (map class x) (clojure.lang.Symbol java.lang.Integer java.lang.Integer) user> (reverse x) (2 1 +) user> (concat x (rest x)) (+ 1 2 1 2) user> (eval x) 3 user> (defn foo [] (let [ops '[+ - * /] ; SO's lisp-highlighting sucks nums (repeatedly #(rand-int 5)) expr (list* (rand-elt ops) (take 10 nums))] (prn expr) (prn (eval expr)))) user> (foo) (+ 4 1 0 3 2 3 4 3 1 2) 23 nil user> (foo) (- 1 3 2 2 1 2 1 4 0 1) -15 nil
alphazero.. 5
Clojure是一个LISP,这意味着它是一种同性语言:数据和代码之间没有结构上的区别.它列出了所有方式.它还有一个可扩展的编译器,允许您通过宏扩展语法.但是从你的问题陈述中不清楚你真的需要这样的东西.
您基本上运行的代码生成列表(实际上是下一代程序),保存它们,然后运行新程序.除非你的世代演变需要新的语法,否则你可能不需要求助于宏.
考虑(+ 1 2)
.作为数据,它是三个项目的链表:符号+
和两个整数.作为代码,它是一个函数调用,说"调用+
用这两个整数作为参数调用的函数并给我结果".您可以对此列表执行任何操作,您可以对任何其他数据列表执行任何操作.你也eval
可以得到一个结果.
user> (def x '(+ 1 2)) #'user/x user> (first x) + user> (rest x) (1 2) user> (map class x) (clojure.lang.Symbol java.lang.Integer java.lang.Integer) user> (reverse x) (2 1 +) user> (concat x (rest x)) (+ 1 2 1 2) user> (eval x) 3 user> (defn foo [] (let [ops '[+ - * /] ; SO's lisp-highlighting sucks nums (repeatedly #(rand-int 5)) expr (list* (rand-elt ops) (take 10 nums))] (prn expr) (prn (eval expr)))) user> (foo) (+ 4 1 0 3 2 3 4 3 1 2) 23 nil user> (foo) (- 1 3 2 2 1 2 1 4 0 1) -15 nil
Clojure是一个LISP,这意味着它是一种同性语言:数据和代码之间没有结构上的区别.它列出了所有方式.它还有一个可扩展的编译器,允许您通过宏扩展语法.但是从你的问题陈述中不清楚你真的需要这样的东西.
您基本上运行的代码生成列表(实际上是下一代程序),保存它们,然后运行新程序.除非你的世代演变需要新的语法,否则你可能不需要求助于宏.