如何评价 Racket 这门编程语言?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何评价 Racket 这门编程语言?相关的知识,希望对你有一定的参考价值。

参考技术A

Matthias Felleisen在1990年代中期建立了PLT,一开始为一个研究团队,不久后逐渐投入程式设计师入门教材的专案开发。

在1995年1月,这个团队决定开发一个建立在 Scheme函数式编程语言上的教学用编程语言环境,Mattew Flatt 简单的从 libscheme 中将 MrEd (Racket 的原始虚拟机器)、wxWidget与一些其他的免费系统结合,接下来的几年内,由 Flatt、Robby Findler、Shriram Krishnamurthi、Cormac Flanagan 和其他许多人组成的团队推出了 DrScheme,一个给 Scheme 程式设计新手的程式设计环境,也作为弱型别编程语言的研究环境,当时 DrScheme 主要支援的编程语言叫做 PLT Scheme。

在此同时,该团队也开始为中学教师开设研习课程,教授他们学习程式设计与函数式程式设计,这些老师和他们的学生所做的现场测试提供了团对专案开发方向重要的依据,在接下来的几年中,PLT 团队为 DrScheme 加入了教学用语言,例如 代数步进器、读取-求值-输出循环、constructor-based printer 和其他许多发明,推出了一套有应用价值的程式教学环境。

2001年,核心团队(Felleisen, Findler, Flatt, Krishnamurthi)也编纂和发行了他们的第一本教科书‘How to Design Programs’,融入了许多他们的教学理念。


    Racket的诞生与发展
    1958年,人工智能之父John McCarthy 发明了一种以 Lambda 演算为基础的符号处理语言,1960年 McCarthy 发表著名论文 Recursive Functions of Symbolic Expressions and Their Computation by Machine , 从此这种语言被命名为 LSIP (List Processor),其语法被命名为:符号表达式(S-Expression)。 LISP构建在7个函数[atom car cdr cond cons eq quote]和2个特型[lambda label] 之上 。

    Lisp诞生之初是为了纯粹的科学研究,代码执行像数学公式一样,以人的大脑来演算。直到麦卡锡的学生斯蒂芬·罗素将eval函数在IBM 704机器上实现后,才开启了Lisp作为一种计算机语言的历史。1962年,第一个完整的Lisp编译器在MIT诞生,从此之后Lisp以MIT为中心向全世界传播。之后十多年,出现了各种Lisp方言。

    1975年,Scheme诞生。Scheme同样诞生与MIT,它的设计哲学是最小极简主义,它只提供必须的少数几个原语,所有其他的实用功能都由库来实现。在极简主义的设计思想下,Scheme趋于极致的优雅,并作为计算机教学语言在教育界广泛使用。

    1984年,Common Lisp诞生。在二十世纪七八十年代,由于Lisp方言过多,社区分裂,不利于lisp整体的发展。从1981年开始,在一个Lisp黑客组织的运作下,经过三年的努力整合后,于1984年推出了Common Lisp。由于Scheme的设计理念和其他Lisp版本不同,所以尽管Common Lisp借鉴了Scheme的一些特点,但没有把Scheme整合进来。此后Lisp仅剩下两支方言: Common Lisp 和 Scheme。

Racket Lang - Scheme如何组合环境的变量和值列表

我是一个全新的计划,并试图创建一个真正的简单解释器作为起点。

给定两个列表,一个包含以下形式的变量:

(x y z) 

还有第二个包含它们的值:

(1 2 3)

我如何将它们组合起来制作一个如下所示的列表:

((x 1) (y 2) (z 3))

然后我会将其添加到我原来的环境中。我正在努力使用这种类型的编程语言来熟悉这些简单的操作。谢谢。

答案

使用map

(map list '(x y z) '(1 2 3))
另一答案

我目前是一名大学生,使用Dr。Dr.的Begining Student环境。因此,在符号和语法方面可能存在一些差异。

(define (combine-list list1 list2)
  (cond
;; Using (cond) function to create a recursion
    [(or (empty? list1) (empty? list2)) empty]
;; The base case: when to stop the recursion
;; It would be written in the first line cuz it will be evaluated first
    [else (cons (list (first list1) (first list2))
;; The recursive case: construct one typical element of the resulting list
                (combine-list (rest list1) (rest list2)))]))
;; Do the recursive case on all of the rest of the lists

我还没有学到(map)的作用,但在我看来,如果输入是两个参数,函数(combine-list)与(map)具有相同的行为,就像@soegaard在答案中所做的那样。

以上是关于如何评价 Racket 这门编程语言?的主要内容,如果未能解决你的问题,请参考以下文章

Coursera课程 Programming Languages, Part A 总结

Racket(lisp 编程语言)中的 [ ] 和 ( ) 括号有啥区别?

The Racket Guide

Racket Lang - Scheme如何组合环境的变量和值列表

使用 lexyacc 在 racket 中实现一个类似 C 语言的程序。

2018.2.23-24 终章 subtype