当前位置:  开发笔记 > 编程语言 > 正文

Clojure中的代码生成

如何解决《Clojure中的代码生成》经验,为你挑选了2个好方法。

(免责声明:我是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> Brian Carper..:

考虑(+ 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



2> alphazero..:

Clojure是一个LISP,这意味着它是一种同性语言:数据和代码之间没有结构上的区别.它列出了所有方式.它还有一个可扩展的编译器,允许您通过宏扩展语法.但是从你的问题陈述中不清楚你真的需要这样的东西.

您基本上运行的代码生成列表(实际上是下一代程序),保存它们,然后运行新程序.除非你的世代演变需要新的语法,否则你可能不需要求助于宏.

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有