方案为什么我的其他声明似乎不起作用?

时间:2018-01-14 00:09:06

标签: scheme

。我正在努力独立地教授自己一些计算机科学技能。我正在处理的问题是要让我创建一种方法来选择三个中最大的两个数字,然后找到这两个数字的平方和。

(define (pro x y z) 
  (cond( (and (< x y) (< x z)) (define a y)(define b z))
       ( (and(< y x) (< y z)) (define a x) (define b z))
       ( else ((define a x )(define b y))))
  (+ (* a a) (* b b))

当我运行z是最小的函数或者绑定最小的数字时,我得到以下错误:

Error: #<undef> is not a function [pro, (anon)]

为什么我收到此错误,如何解决?

如果重要的话,我一直在使用repl.it来运行这个程序。

2 个答案:

答案 0 :(得分:1)

首先,使用define这样的方式对于Scheme代码来说是完全奇怪的。

之后,我发现代码存在两个问题。第一个是创建错误的那个,就是你在else子句中有一层额外的parens。以下

((定义一个x)(定义b y))

将评估第一个定义并尝试将其应用为过程。 (define ...)的评估返回#undef,它是错误消息的来源。

如果您解决了这个问题,那么您的下一个问题是您的平方码代码超出了cond中定义的范围,您会发现a和b没有在那里定义。

答案 1 :(得分:0)

你应该这样做:

(define (max-of-3 x y z)
  (cond
    ((and (< x y) (< x z)) (values y z))
    ((and (< y x) (< y z)) (values x z))
    (else                  (values x y))))

(define (pro x y z)
  (let-values (((a b) (max-of-3 x y z)))
    (+ (* a a) (* b b))))

甚至

(define (pro x y z)
  (let-values
      (((a b) (cond
                ((and (< x y) (< x z)) (values y z))
                ((and (< y x) (< y z)) (values x z))
                (else                  (values x y)))))
    (+ (* a a) (* b b))))