[英]r5rs: Not a procedure errors
這是我出來的代碼(顯示所有長度為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]
完成調用(等價嗎?n關閉)並返回“ 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)))
具有以下結構:
((if predicate
consequence
'undefined)
(if predicate2
consequence2
'undefined))
並且兩個的結果( if
是bps-iter
或某個未定義的值)。假設兩個可以縮寫為if-exp1和if-expr2,則得到:
(if-expr1 if-expr2)
由此可以斷定,如果predicate1不正確,您將嘗試調用undefined,就好像它是一個函數一樣,如果是true,則bts-iter
至少應返回一個函數。 由於這些都不是真的,所以注定會失敗。
如何使用:
(if predicate
consequence
alternative) ; optional in R6RS, turns into undefined
這些可以嵌套。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.