下面是我编写的代码(显示所有长度为n的对对括号)
(define (combine-list l r)
(append l (cons r '())))
;(combine-list '(1 2 3) '(4 4))
(define(bps n)
(bps-iter '() (/ n 2) 0 0))
(define (bps-iter lst n open close) (;(display open) (display close) (display "\n")
(cond ((eq? n close) (display lst))
(else ((if (> open close)
(bps-iter (combine-list lst 1) n open (+ 1 close) ))
(if (< open n)
(bps-iter (combine-list lst 0) n (+ open 1) close)))
)
)))
(bps 4)事实证明,
application: not a procedure;
expected a procedure that can be applied to arguments
given: #<void>
arguments...: [none]当它完成调用时有什么问题吗(eq?N close)并返回到“else”以查找另一组括号?
发布于 2017-12-14 01:44:49
你的问题是:
((if (> open close)
(bps-iter (combine-list lst 1) n open (+ 1 close)))
(if (< open n)
(bps-iter (combine-list lst 0) n (+ open 1) close)))它具有这样的结构:
((if predicate
consequence
'undefined)
(if predicate2
consequence2
'undefined))这两个if的结果要么是bps-iter的结果,要么是某个未定义的值。假设这两个可以缩写为if-exp1和if-expr2,则得到:
(if-expr1 if-expr2)由此可以得出结论,如果predicate1不是true,您将尝试调用undefined,就好像它是一个函数一样,如果它是true,那么bts-iter至少应该返回一个函数。由于这些都不是真的,它注定要失败。
如何使用if:
(if predicate
consequence
alternative) ; optional in R6RS, turns into undefined这些可以嵌套在一起。
https://stackoverflow.com/questions/47797563
复制相似问题