Racket中特殊功能在创建新语言中的作用

时间:2019-06-11 17:03:31

标签: racket

我很感兴趣地阅读了these pages,该书介绍了如何使用Racket中提供的工具制作新语言。它创建了一种新的语言,可以用相反的波兰语符号表示数字和运算符,并找到答案。

但是,同样的任务也可以通过简单的编程来实现。以下是Python中的代码,但可以是任何通用语言中的代码:

# Items for calculation: 
slist=["4", "8", "+", "5", "*", "10", "/", "4", "-", "6", "5", "/", "*"]

# Main code: 
mainstack = []
for item in slist: 
    print("mainstack: ", mainstack)
    print("item: ", item)
    if item in ['+','-','*','/']: 
        n2 = mainstack.pop()
        n1 = mainstack.pop()
        if item == '+':     mainstack.append(n1 + n2)
        elif item == '-':   mainstack.append(n1 - n2)
        elif item == '*':   mainstack.append(n1 * n2)
        elif item == '/':   mainstack.append(n1 / n2)
    else: 
        try:
            mainstack.append(float(item))
        except: 
            print("Invalid entry: ", item)
            quit()
print("Final answer: ", mainstack)

输出:

mainstack:  []
item:  4
mainstack:  [4.0]
item:  8
mainstack:  [4.0, 8.0]
item:  +
mainstack:  [12.0]
item:  5
mainstack:  [12.0, 5.0]
item:  *
mainstack:  [60.0]
item:  10
mainstack:  [60.0, 10.0]
item:  /
mainstack:  [6.0]
item:  4
mainstack:  [6.0, 4.0]
item:  -
mainstack:  [2.0]
item:  6
mainstack:  [2.0, 6.0]
item:  5
mainstack:  [2.0, 6.0, 5.0]
item:  /
mainstack:  [2.0, 1.2]
item:  *
Final answer:  [2.4]

Racket的特殊功能在制作新语言方面的特殊作用是什么?为什么不简单地使用常规编程将指定的特定于域的输入转换为所需的输出呢?

1 个答案:

答案 0 :(得分:2)

有区别。在用Python编写语言解释器后。为表面语言创建解析器并将其转换为包括Racket基库的s表达式,基本上意味着结果代码将以本地方式运行。您可以编译“堆栈代码”并获取二进制文件。

在Python中,您可以编写一个计算器编译器,将代码编译为python,并允许动态编译,以便python创建以本地语言运行代码的字节码,但是它不具有允许您用python用其他语言编写的功能。 。

球拍不是一种语言,而是像Scheme派生的方言一样带有语言修饰的语言,系统可以编写一种新的语言,而实际上,这种语言成为了Racket的模块。然后,您可以用一种语言编写内容,也可以用另一种语言将其导入为库。它具有Parrot的感觉,当时的想法是Python和Perl具有相同的运行时,并且它们可以共享库。

作为示例,您可以在Racket中加载Algol60,Racket是委员会设计的最成功的编程语言,也是当今大多数编程语言的前身。 Python和C都是Algol的方言!

我敢打赌,您可以编写一个Python解析器和一个python基本库,以便您可以将其他库中使用python编写的库提供给它,并在Racket下运行完整的python。这样,您就可以导入其他球拍代码,就像用Python编写并直接使用它一样,也可以导入python库并以Racket支持的任何其他语言使用它。

使它们变得更甜蜜的唯一一件事就是,如果他们可以在Chez Scheme的nanopass编译器下制作Racket核心。然后,您将能够将Racket支持的任何内容编译为几乎所有内容。