【问题标题】:r5rs: Not a procedure errorsr5rs:不是程序错误
【发布时间】:2017-12-13 16:10:36
【问题描述】:

这是我出来的代码(显示所有长度为 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'寻找另一组括号时有什么问题吗?

【问题讨论】:

  • 这几乎总是因为括号太多。你有两个地方太多了。

标签: scheme parentheses r5rs


【解决方案1】:

你的问题是:

((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,就好像它是一个函数一样,如果它为真,bts-iter 至少应该返回一个函数。由于这些都不是真的,它注定要失败。

如何使用如果:

(if predicate
    consequence
    alternative) ; optional in R6RS, turns into undefined

这些可以嵌套。

【讨论】:

  • 有没有一种可能的方式,在 r5rs 中,如果两个 if 语句都满足谓词,则它们都将被处理?如果我尝试嵌套它们,则不可能同时触发它们。
  • @ZhiweiHuang (begin expr1 ... exprn) 就像 C 语言中的 {...}。除了最后一个表达式之外的所有表达式仅用于副作用,表单的结果是exprn 的值。对于不需要顶级嵌套的表达式let 会做同样的工作。
猜你喜欢
  • 1970-01-01
  • 2017-04-19
  • 2020-05-28
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多