诺维格大师曾经说过:
Scheme 的美妙之处在于,完整的语言只需要 5 个关键字和 8 个句法形式。相比之下,Python 有 33 个关键字和 110 种句法形式,而 Java 有 50 个关键字和 133 种句法形式。所有这些括号可能看起来很吓人,但 Scheme 语法具有简单性和一致性的优点。(有些人开玩笑说“Lisp”代表“很多令人讨厌的愚蠢括号”;我认为它代表“Lisp 在语法上是纯粹的”。)
那么 Haskell 是如何比较的呢?
二叉树的映射函数的定义是:
(define (binary-tree-map proc tree)
(cond ((null? tree) null)
((not (pair? tree)) (proc tree))
(else (cons (binary-tree-map proc (car tree))
(binary-tree-map proc (cdr tree))))))
Run Code Online (Sandbox Code Playgroud)
n-ary树的地图功能是什么样的?尝试:
(define (n-tree-map proc tree)
(cond ((null? tree) null)
((not (pair? tree)) (proc tree))
(else (apply map append (lambda (p)(n-tree-map proc (cdr tree)))))))
Run Code Online (Sandbox Code Playgroud) 如何可视化任意树?
例如:
(define T1 '(and (or x1 x2)(or x3 x4 x5)))
或者使用以下命令生成:
(define functions '(not if and or))
(define terminals '(A0 A1 A2 D0 D1))
(define functions&terminals (append terminals functions ))
(define (pick-one list)
(list-ref list (random (length list))))
(define arities '((if . 3)(and . 2)(or . 2)(not . 1)))
(define (terminal? symbol)
(find (lambda (x)(eq? x symbol)) terminals))
(define (function? symbol)
(find (lambda (x)(eq? x symbol)) functions))
(define (arity non-terminal)
(let ((arity (find (lambda (x)(eq? non-terminal (car x))) arities))) …Run Code Online (Sandbox Code Playgroud) 在读的时候:
https://docs.racket-lang.org/reference/pairs.html
我碰到 list*
与 list 类似,但最后一个参数用作结果的尾部,而不是最后一个元素。仅当最后一个参数是一个列表时,结果才是一个列表。
“最后一个参数用作结果的尾部,而不是最后一个元素”是什么意思?我认为列表总是以空列表结尾:'()
如果:“仅当最后一个参数是列表时,结果才是列表”,那么还有什么?我认为计划中的所有内容都是一个列表。
AND 和 OR 是宏,并且由于宏不是方案/球拍中的第一类,因此它们不能作为参数传递给其他函数。部分解决方案是使用 and-map 或 or-map。是否可以编写一个接受任意宏并将其转换为函数的函数,以便它可以作为参数传递给另一个函数?是否有任何语言具有一流的宏?
如果两个布尔值相同,则两个布尔值相等,两个数字相似。如果两个集合具有相同的元素,则它们相等。如果检查两组是否相等,我们可以使用以下方案/球拍函数:
\n\n(define (same-set? l1 l2)\n (and (subset? l1 l2) (subset? l2 l1)))\nRun Code Online (Sandbox Code Playgroud)\n\n那么这样的函数是如何自动生成的呢?可以为任意数据类型生成它吗?
\n\n等价关系的基本性质是:
\n\n替换性质:对于任意数量a和b以及任意表达式F(x),如果a = b,则F(a) = F(b)(如果两边都有意义,即格式良好)。\n一些具体例子其中:
\n\n对于任何实数a、b和c,如果a = b,则a + c = b + c(这里F(x)是x + c);
\n\n对于任何实数 a、b 和 c,如果 a = b,则 a \xe2\x88\x92 c = b \xe2\x88\x92 c (这里 F(x) 是 x \xe2\x88\x92 c) ;
\n\n对于任何实数a、b和c,如果a = b,则ac = bc(这里F(x)是xc);
\n\n对于任何实数 a、b 和 c,如果 a = b 且 c 不为零,则 a/c = b/c(此处 F(x) 为 x/c)。 …
如何获得每个子列表的产品?尝试:
(apply map * '((1 2) (3 4)))
Run Code Online (Sandbox Code Playgroud)
但它返回:'(3 8),而它应该返回'(2 12)