此代码有什么问题?
(define (make-node key data )
(list key data 'null 'null ) )
(define (right)(2) )
(define (left) (3) )
;;inserts a key to the tree
;; string x string -> list
(define (insert lst key data )
(if (null? lst )
(make-node key data )
(cond ( [(string>? key (car lst)) (list-set lst 2 (insert lst key data)) ]
[(string<? key (car lst)) (list-set lst 3 (insert lst key data)) ]
[(string=? key (car lst)) (list-set lst 1 data ) ]
))))
(define (list-set lst ix data )
(if (eqv? ix 0 ) ( cons data (cdr lst ) ) ( cons (car lst) (list-set ( cdr lst) ( - ix 1 ) data ))))
( define (newdiction) [
let ( ( [ tree '() ]) [ (msg key data )[ cond ( (eqv? msg 'insert ) [ set! tree (insert tree key data ) ] ) ] ] )
] )
鸡肉方案解释器吐口水:
CHICKEN
(c) 2008-2014, The Chicken Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.9.0.1 (stability/4.9.0) (rev 8b3189b)
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
bootstrapped 2014-06-07
; loading dict.scm ...
Error: during expansion of (let ...) - in `let' - symbol expected: (let (((tree (quote ()))) ((msg key data) (cond ((eqv? msg (quote insert)) (set! tree (insert tree key data)))))))
Call history:
<syntax> (define (list-set lst ix data) (if (eqv? ix 0) (cons data (cdr lst)) (cons (car lst) (list-set (cdr lst...
<syntax> (##core#set! list-set (##core#lambda (lst ix data) (if (eqv? ix 0) (cons data (cdr lst)) (cons (car lst...
<syntax> (##core#lambda (lst ix data) (if (eqv? ix 0) (cons data (cdr lst)) (cons (car lst) (list-set (cdr lst...
<syntax> [list-set] (##core#begin (##core#if (eqv? ix 0) (cons data (cdr lst)) (cons (car lst) (list-set (cdr lst) (- ix...
<syntax> [list-set] (##core#if (eqv? ix 0) (cons data (cdr lst)) (cons (car lst) (list-set (cdr lst) (- ix 1) data)))
<syntax> [list-set] (eqv? ix 0)
<syntax> [list-set] (cons data (cdr lst))
<syntax> [list-set] (cdr lst)
<syntax> [list-set] (cons (car lst) (list-set (cdr lst) (- ix 1) data))
<syntax> [list-set] (car lst)
<syntax> [list-set] (list-set (cdr lst) (- ix 1) data)
<syntax> [list-set] (cdr lst)
<syntax> [list-set] (- ix 1)
<syntax> (define (newdiction) (let (((tree (quote ()))) ((msg key data) (cond ((eqv? msg (quote insert)) (set......
<syntax> (##core#set! newdiction (##core#lambda () (let (((tree (quote ()))) ((msg key data) (cond ((eqv? msg...
<syntax> (##core#lambda () (let (((tree (quote ()))) ((msg key data) (cond ((eqv? msg (quote insert)) (set! t...... <--
此代码遭受了太多的括号。因此,方案非常灵活,因此您可以拥有这样的代码:
((som-func som-arg) some-other-arg)
那里发生了什么?出色地。由于(some-func som-arg)
不是一种特殊的形式或宏,因此必须是导致功能的表达式,以便对其进行评估。由于some-func
不是一种特殊的形式或宏,因此必须是导致功能的表达式,因此它对其进行了评估和some-arg
并应用它。结果将是用some-other-arg
作为参数评估的函数。
我看到您使用[ ... ]
以及( ... )
。知道这些区别只是它们的外观和对它们的解释是相同的。因此,如果将(+ 1 2)
更改为[+ 1 2]
,则两次都会获得3
。没有不同。您可以使用它们来指示诸如let
之类的宏中的某种分组,但对实现没有区别。
如果您查看let
:
(let ([(tree '())] ...)
body ...)
因此,第一个变量是 (tree '())
,无值 ..但是(tree '())
不是符号,而是列表。
(let ([tree '()] ...)
body ...)
这里的tree
与'()
绑定。看?现在查看您,第一个cond
您有一个术语。通常cond
具有两个以上,否则简单的if
就足够了。一个术语中的谓词是:
[(string>? key (car lst)) (list-set lst 2 (insert lst key data))]
现在没有围绕整个内容的额外( ... )
,上面的整个代码将成为一个术语,而不仅仅是播放谓词。
但请坚持..为什么您有cond
和 if
。cond
是if-elseif-else
。没有办法使整个事情一个cond
吗?是的!一个cond
是相同的:
(define (insert lst key data)
(cond
[(null? lst) (make-node key data)]
[(string>? key (car lst)) (list-set lst 2 (insert lst key data))]
[(string<? key (car lst)) (list-set lst 3 (insert lst key data))]
[else (list-set lst 1 data)]))
我还注意到您检查它是否小于,大于和等于,但没有else
(替代),所以我假设它是否不少于或大于它必须等于的,因此一切都在最后一个既然您现在有一个完整的维恩图。
您正在执行(let (((tree '()) ...)
,但let
期望变量/值对列表。因此,您必须删除一组括号:(let ((tree '())) ...)
在LISP和方案中,括号具有非常具体的含义,您不能仅在不改变其含义的情况下添加额外的括号,就像您以多种语言一样。