Functional programming 为什么列表函数调用在Scheme中返回运行时错误?

Functional programming 为什么列表函数调用在Scheme中返回运行时错误?,functional-programming,scheme,Functional Programming,Scheme,获取我在scheme中创建的二进制搜索树的错误 $gosh main.sc *** ERROR: list required, but got 5 Stack Trace: _______________________________________ 这是我的密码。我认为错误与我调用函数的方式有关,但我不确定到底是什么错误。我使用两个必需的参数调用insert函数:tree和值5 (define (member? t v) (cond ((null? t)

获取我在scheme中创建的二进制搜索树的错误

$gosh main.sc
*** ERROR: list required, but got 5
Stack Trace:
_______________________________________

这是我的密码。我认为错误与我调用函数的方式有关,但我不确定到底是什么错误。我使用两个必需的参数调用insert函数:tree和值5

(define (member? t v)
    (cond 
        ((null? t)
            #f
        )
        ((< node (car t))
            (member? (cadr t) v))
        ((> node (car t))
            (member? (caddr t) v))
        (else
            #t
        )
    )
)

(define (insert t v)
    (cond
        ((null? t)
            (list v '() '())
        )
        ((< v (car t))
            (list (car t) (insert (cadr t) v) (caddr t))
        )
        ((>= v (car t)) 
                (list (car t) (cadr t) (insert (caddr t) v))
        )
        (else
            t
        )
    )
)


(define (fold func val lst)
  (if (null? lst) val (fold func (func val (car lst)) (cdr lst))))

(define (build lst)
  (fold (lambda (t v) (insert t v)) '() lst))

(define t (list 10 '() '()))
(insert t 5)

display  (member t 5)

display t
(定义(成员?t v)
(续)
((空?t)
#f
)
(<节点(车辆t))
(成员?(cadr t)v)
((>节点(车辆t))
(成员?(caddr t)v)
(其他
#t
)
)
)
(定义(插入t v)
(续)
((空?t)
(列表v'()'())
)
(=v(车t))
(列表(t车)(cadr t)(插入(cadr t)v))
)
(其他
T
)
)
)
(定义(折叠函数值lst)
(如果(空?lst)val(折叠功能(功能val(汽车lst))(cdr lst)))
(定义(构建lst)
(折叠(lambda(tV)(插入tV))'()lst))
(定义t(列表10’()’())
(插入t 5)
显示器(成员t 5)
显示t
您介意调用
(成员t5)
,它与
(成员’(10’()())5)
相同。现在
成员
与您定义的
成员
不同,因为它有不同的名称<代码>成员是如下所示的核心库:

(define (member obj lst)
  (cond ((null? lst) #f)
        ((equal? obj (car lst)) lst)
        (else (member obj (cdr lst)))))
;; node doesn't exist in OPs code, but my implementation doesn't like member? without it
(define node 5)

;; possible typo by using the variable node ?
(define (member? t v)
  (cond
    ((null? t)
     #f)
    ((< node (car t))
     (member? (cadr t) v))
    ((> node (car t))
     (member? (caddr t) v))
    (else
     #t)))

(define (insert t v)
  (cond
    ((null? t)
     (list v '() '()))
    ((< v (car t))
     (list (car t) (insert (cadr t) v) (caddr t)))
    ((>= v (car t))
     (list (car t) (cadr t) (insert (caddr t) v)))
    (else 
     t)))


(define (fold func val lst)
  (if (null? lst) val (fold func (func val (car lst)) (cdr lst))))

(define (build lst)
  (fold (lambda (t v) (insert t v)) '() lst))

(define t (list 10 '() '()))
(insert t 5)

;; NB doesn't call a procedure, just evaluates it. 
display
;; Here the arguments are the wrong order and you don't use memeber?
(member t 5)
;; NB doesn't call a procedure, just evaluates it. 
display
t
您的
成员?
已交换了两个参数,因此当您写错名称并使用报告版本
成员时
5
不为空,那么它将执行
(汽车5)
,这将非常失败。
5
不是所需类型的
list
的错误消息相当不错。它可能会向bean拼写出它是失败的
成员

还有一件事。如果将对
成员的调用替换为对
成员的调用
,则会遇到更多问题。您使用的变量
节点
未在任何地方定义

括号的缩进和放置不是goo-lisp风格。您的代码应该这样编写:

(define (member obj lst)
  (cond ((null? lst) #f)
        ((equal? obj (car lst)) lst)
        (else (member obj (cdr lst)))))
;; node doesn't exist in OPs code, but my implementation doesn't like member? without it
(define node 5)

;; possible typo by using the variable node ?
(define (member? t v)
  (cond
    ((null? t)
     #f)
    ((< node (car t))
     (member? (cadr t) v))
    ((> node (car t))
     (member? (caddr t) v))
    (else
     #t)))

(define (insert t v)
  (cond
    ((null? t)
     (list v '() '()))
    ((< v (car t))
     (list (car t) (insert (cadr t) v) (caddr t)))
    ((>= v (car t))
     (list (car t) (cadr t) (insert (caddr t) v)))
    (else 
     t)))


(define (fold func val lst)
  (if (null? lst) val (fold func (func val (car lst)) (cdr lst))))

(define (build lst)
  (fold (lambda (t v) (insert t v)) '() lst))

(define t (list 10 '() '()))
(insert t 5)

;; NB doesn't call a procedure, just evaluates it. 
display
;; Here the arguments are the wrong order and you don't use memeber?
(member t 5)
;; NB doesn't call a procedure, just evaluates it. 
display
t
;;OPs代码中不存在节点,但我的实现不喜欢成员?没有它
(定义节点5)
;; 使用变量节点可能出现的打字错误?
(定义(成员?t v)
(续)
((空?t)
#(f)
(<节点(车辆t))
(成员?(cadr t)v)
((>节点(车辆t))
(成员?(caddr t)v)
(其他
#t) ))
(定义(插入t v)
(续)
((空?t)
(列表v'()'())
(=v(车t))
(列表(车辆t)(cadr t)(插入(cadr t)v)))
(其他
t) ))
(定义(折叠函数值lst)
(如果(空?lst)val(折叠功能(功能val(汽车lst))(cdr lst)))
(定义(构建lst)
(折叠(lambda(tV)(插入tV))'()lst))
(定义t(列表10’()’())
(插入t 5)
;; NB不调用过程,只对其求值。
显示
;; 这里的参数顺序错误,你不使用memeber?
(委员t 5)
;; NB不调用过程,只对其求值。
显示
T

无法在更成熟的实现中重现,最终可能是您的解释器因语法错误而阻塞。(Gauche甚至还不是1.0版,所以bug也就不足为奇了。)