Scheme编程定义min-ratio函数提示ratio已自由绑定错误如何解决?
错误原因
- 核心是Scheme的语法规则限制:函数内部的辅助定义必须放在函数体的最开头,不能出现在可执行代码之后。你当前的代码中,
min-ratio的函数体第一行是let执行语句,里面直接调用了ratio,此时解释器还没读到ratio的定义,会默认ratio是全局作用域的自由变量,后续再在函数内部定义ratio就会触发命名冲突,和你收到的报错提示完全对应。 - 代码同时存在几处隐性语法错误:
let语句里的(iter 1 (car r-list) (r-list))多了多余括号,r-list是你绑定的列表变量,加括号会被识别为调用无参函数,直接写r-list即可iter函数里的<= vlaue存在拼写错误,正确写法是value
解决方法
调整代码结构,把所有内部辅助函数的定义移到min-ratio函数体的最开头,修正语法错误后代码如下:
(define (min-ratio list) ;;Pivot row ;; 内部辅助函数定义放在最前 (define (ratio list) (if (null? (cdr list)) '() (let ((row (car list))) (cons (/ (last-element row) (list-ref row pivot-column)) (ratio (cdr list)))))) (define (iter position value list) (if (null? (cdr list)) '() (if (negative? value) (iter (+ position 1) (cadr list) (cdr list)) (if (or (negative? (cadr list)) (<= value (cadr list))) (iter (+ position 1) value (cdr list)) (cons position (iter (+ position 1) (cadr list) (cdr list))))))) ;; 执行逻辑放在定义之后 (let ((r-list (ratio list))) (last-element (cons 0 (iter 1 (car r-list) r-list)))))
如果你的运行环境没有内置last-element函数,需要额外实现该取列表末尾元素的逻辑即可。
内容的提问来源于stack exchange,提问作者Sandesh Shah
相关产品推荐
相关产品推荐

