首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >r5rs:非过程错误

r5rs:非过程错误
EN

Stack Overflow用户
提问于 2017-12-14 00:10:36
回答 1查看 49关注 0票数 0

下面是我编写的代码(显示所有长度为n的对对括号)

代码语言:javascript
复制
(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)

事实证明,

代码语言:javascript
复制
application: not a procedure;
expected a procedure that can be applied to arguments
  given: #<void>
  arguments...: [none]

当它完成调用时有什么问题吗(eq?N close)并返回到“else”以查找另一组括号?

EN

回答 1

Stack Overflow用户

发布于 2017-12-14 01:44:49

你的问题是:

代码语言:javascript
复制
((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)))

它具有这样的结构:

代码语言:javascript
复制
((if predicate
     consequence
     'undefined)
 (if predicate2
     consequence2
     'undefined))

这两个if的结果要么是bps-iter的结果,要么是某个未定义的值。假设这两个可以缩写为if-exp1和if-expr2,则得到:

代码语言:javascript
复制
(if-expr1 if-expr2)

由此可以得出结论,如果predicate1不是true,您将尝试调用undefined,就好像它是一个函数一样,如果它是true,那么bts-iter至少应该返回一个函数。由于这些都不是真的,它注定要失败。

如何使用if:

代码语言:javascript
复制
(if predicate
    consequence
    alternative) ; optional in R6RS, turns into undefined

这些可以嵌套在一起。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47797563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档