鸡肉计划;使用让内部功能时出错



此代码有什么问题?

(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 ifcondif-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和方案中,括号具有非常具体的含义,您不能仅在不改变其含义的情况下添加额外的括号,就像您以多种语言一样。

相关内容

  • 没有找到相关文章

最新更新