有许多语言允许某种元编程。尤其令我惊讶的是,没有任何关于Lisp语言家族的答案。
来自维基百科:
元编程是计算机程序的编写,具有将程序视为其数据的能力。
在下文中:
Lisp可能是具有元编程功能的典型语言,这既因为其历史悠久的历史,又因为其元编程的简单性和强大性。
Lisp语言
接下来是Lisp的快速入门介绍。
查看代码的一种方法是按照一组说明进行操作:先执行此操作,然后再执行此操作,然后再执行此其他操作...这是一个清单!程序要做的事情的清单。当然,您可以在列表中包含列表以表示循环,等等。
如果我们代表含有的元素A,B,C的列表,D是这样的:(ABCD),我们得到的东西,看起来像一个Lisp函数调用,这里a
是函数,并且b
,c
,d
是参数。如果事实是典型的“ Hello World!” 程序可以这样写:(println "Hello World!")
当然b
,c
或者d
也可以是对某些结果求值的列表。以下内容:(println "I can add :" (+ 1 3) )
然后将打印““我可以添加:4”。
因此,程序是一系列嵌套列表的第一个元素是一个函数。好消息是我们可以操纵列表!这样我们就可以操纵编程语言。
Lisp的优势
Lisps与其说是编程语言,不如说是制作编程语言的工具包。可编程的编程语言。
这不仅在Lisps中更容易创建新的运算符,而且几乎不可能用其他语言编写某些运算符,因为在传递给函数时会评估参数。
例如,使用类似C的语言,您要自己编写一个if
运算符,例如:
my-if(condition, if-true, if-false)
my-if(false, print("I should not be printed"), print("I should be printed"))
在这种情况下,两个参数都将按照与参数求值顺序有关的顺序进行评估和打印。
在Lisps中,编写运算符(我们称其为宏)和编写函数几乎是同一件事,并且以相同的方式使用。主要区别在于宏参数在作为参数传递给宏之前不会进行评估。对于像if
上面这样写一些运算符,这是必不可少的。
现实世界的语言
在这里显示精确度有点超出范围,但是我建议您尝试使用一个Lisp编程以了解更多信息。例如,您可以看一下:
哦,顺便说一句,Lisp是指LISt Processing。
关于你的例子
我将在下面给出使用Clojure的示例:
如果你能写一个add
Clojure中的功能(defn add [a b] ...your-implementation-here... )
,你可以将其命名+
像这样(defn + [a b] ...your-implementation-here... )
。实际上,这是在实际实现中所做的事情(该函数的主体涉及更多点,但定义与我上面编写的基本相同)。
那么中缀符号呢?好吧Clojure使用prefix
(或波兰语)表示法,因此我们可以创建一个infix-to-prefix
将前缀代码转换为Clojure代码的宏。这实际上非常简单(实际上是clojure koans 中的宏练习之一)!也可以在野外看到它,例如,参见Incanter $=
macro。
这是koans解释的最简单的版本:
(defmacro infix [form]
(list (second form) (first form) (nth form 2)))
;; takes a form (ie. some code) as parameter
;; and returns a list (ie. some other code)
;; where the first element is the second element from the original form
;; and the second element is the first element from the original form
;; and the third element is the third element from the original form (indexes start at 0)
;; example :
;; (infix (9 + 1))
;; will become (+ 9 1) which is valid Clojure code and will be executed to give 10 as a result
为了进一步说明这一点,一些Lisp引用:
“使Lisp与众不同的部分原因在于它旨在发展。您可以使用Lisp定义新的Lisp运算符。随着新抽象的流行(例如,面向对象的编程),在Lisp中实现它们总是很容易。像DNA一样,这种语言也不会过时。”
— Paul Graham,ANSI Common Lisp
“在Lisp中编程就像在与宇宙的原始力量一起玩。感觉就像指尖之间的闪电。没有其他语言可以让您感到亲近。”
— Glenn Ehrlich,通往Lisp的道路