Scheme 计划和让错误

Scheme 计划和让错误,scheme,lisp,let,Scheme,Lisp,Let,我一辈子都无法找出这段代码产生错误的原因。 以下是错误: let*:错误语法(缺少正文)in:(let*((tempp2(p2)(letrec)((mloop(p1p2)(if((length p1)0))(else if)(=(length p2)0)((set!p2(pn))(multiloop(cdr p1)(p2)))(else(let*((prod)(append(prod)(cons)((coeff(car p1)))(coeff(car))))(+(expon(car p1)))(

我一辈子都无法找出这段代码产生错误的原因。 以下是错误:

let*:错误语法(缺少正文)in:(let*((tempp2(p2)(letrec)((mloop(p1p2)(if((length p1)0))(else if)(=(length p2)0)((set!p2(pn))(multiloop(cdr p1)(p2)))(else(let*((prod)(append(prod)(cons)((coeff(car p1)))(coeff(car))))(+(expon(car p1)))(expon(car))(expon(car);(expon(car);(car)p2);))))))(set!p2(cdr p2))(简化(排序newone(()()(())())))

代码如下:

(define multiplyPoly (lambda (p1 p2)
                 (
                  (let* ((hardp2 (p2)
                 (letrec 
                     ((mloop (p1 p2)
                       (if (= (length p1) 0))
                       (else if ((=(length p2) 0) ((set! p2 (hardp2)) (multiloop (cdr p1) (p2))))
                    (else
                     (let* ([prod  (append (prod) (cons(*(coeff(car p1)) (coeff(car p2))) (+(expon(car p1)) (expon(car p2)))))]))
                      (set! p2 (cdr p2))
                           (mloop (p1 p2))
                      (simplify (sort newone)))))))))))))

你的代码中有很多语法错误。我建议你安装一个IDE,它可以匹配括号并正确识别你的代码,比如。DrRacket支持R5RS和R6RS,所以你仍然可以使用DrRacket在Scheme中编程

通常,
let
let*
letrec
具有以下形式:

(let ((var expression) ...)
  body)
letrec
letrec*
中,表达式看起来像
(lambda(arg…)表达式)

如果您使用任何类似于
(If(正数?x)-+)
的模式表达式,并用一对额外的括号将它们括起来,则您将调用结果作为过程:
((If(正数?-1)-+);==>0

if
的工作原理如下:

(if predicate-expression
    consequent-expression
    alternative-expression)
如果需要嵌套,则需要将嵌套的If作为可选表达式

(if predicate-expression
    consequent-expression
    (if predicate-expression2
        consequent-expression2
        alternative-expression))
如果嵌套在那里,cond可能更匹配。上面的表达式可能是:

(cond (predicate-expression consequent-expression)
      (predicate-expression2 consequent-expression)
      (else alternative-expression))

else
cond
中有特殊的含义,因此它不能独立工作。

我不擅长从一般的例子中学习。你有什么具体的信息吗?为什么认为没有正文?@ZackSchwartz,因为
let
-表达式只包含名称的绑定。它还需要一个正文,而正文是是表达式的值。
(let((x 5)(y 3))(+x y))
的计算结果为8,但
(let((x 5)(y 3)))
无效。您似乎试图编写C,并将
let
-变量视为变量声明块。Scheme不是这样工作的,您最好的做法可能是忘记您已经了解的编程知识,并开始通过编写比此更小的Scheme程序来重新学习。不要使用
set!
.那么如何声明变量呢?
(let((varname1(+45))(varname2(list 45))(varname3100))(list varname1 varname2 varname3))
有3个变量,并在正文中列出了3个变量。这些变量在正文外不存在。@halfer这是一个打字错误。ø在挪威语键盘中紧靠着l,所以我想我在按l时触到了它。现已修复:-)