Scheme中如何创建lambda过程?二次函数判别式匿名函数报错求助
报错原因定位
- 括号匹配错误:Scheme为前缀表达式语法,所有表达式、参数列表必须用配对的闭合括号包裹,你当前代码中
define、lambda的闭合位置完全错乱,是直接触发Invalid define报错的核心原因 - 参数书写错误:
lambda的参数列表为独立的括号包裹的列表,你写的lambda(abc)未加空格,会被识别为单个名为abc的参数,而非a、b、c三个独立参数 - 表达式语法错误:
- 变量名连写:
(*bb)会被识别为名为bb的变量,而非b乘以b,正确写法是(* b b),变量与运算符、变量与变量之间必须加空格 - 运算符位置错误:Scheme要求运算符放在表达式首位,你写的
(sqrt - (*bb)(*4ac))完全颠倒了运算顺序,判别式的核心公式是b²-4ac,不需要套平方根运算 - 一元负号写法错误:Scheme中负号作为运算符使用时必须放在括号内,不能直接写
-b,正确写法是(- b)
- 变量名连写:
- 嵌套lambda逻辑错位:嵌套lambda的执行顺序是「先定义内部lambda,再紧跟传入的实际参数」,你把参数、返回值、调用位置的顺序完全颠倒,导致语法结构断裂
修正代码示例
满足作业要求:计算二次函数判别式的匿名函数
如果直接调用该匿名函数,写法如下:
; 示例参数a=1, b=2, c=1,返回值为判别式结果 ((lambda (a b c) (- (* b b) (* 4 a c))) 1 2 1)
如果需要将该函数赋值给变量方便复用,写法为:
(define calc-discriminant (lambda (a b c) (- (* b b) (* 4 a c)))) ; 调用方式:(calc-discriminant 系数a 系数b 系数c)
你原本尝试编写的「通过判别式计算二次方程两个根」的正确版本
完全对齐你原本写的嵌套lambda结构的修正版:
(define roots (lambda (a b c) ; 内部lambda接收判别式作为参数,返回两个根的列表 ((lambda (discriminant) (list (/ (+ (- b) (sqrt discriminant)) (* 2 a)) (/ (- (- b) (sqrt discriminant)) (* 2 a)))) ; 这里传入内部lambda的实际参数,就是外层计算得到的判别式 (- (* b b) (* 4 a c))))) ; 调用示例:(roots 1 2 1) 返回(-1 -1)
内容的提问来源于stack exchange,提问作者user13508239
相关产品推荐
相关产品推荐

