【问题标题】:2 unbound variable errors in my scheme program我的方案程序中有 2 个未绑定变量错误
【发布时间】:2015-06-22 02:02:38
【问题描述】:

我对我的程序在方案中遇到的两个未绑定变量错误有疑问:';Unbound variable: temp' 和 ';Unbound variable: record'。

我最终尝试创建一个排序函数,按 ID 升序对我的名册(学生信息列表,每个元素是一个子列表)进行排序。 roster 的每个子列表包含 3 个元素:ID 号(数字字符串)、名称(字符字符串)和等级(int)作为自己的列表。 ID 号是 roster 中每个子列表的第一个元素。目前我正在制作一个“最小”辅助函数来返回名册中所有子列表的最小 ID 号(作为记录)。

快速旁注:我不允许使用任何套装!函数或 do-loops,或任何内置的排序函数。

我目前“最小”的目标是将名册附加到局部变量“temp”,因为我不希望名册在从函数返回时发生变化。在执行此操作之前,我必须先获取我的“未绑定变量:记录”,然后我尝试将记录定义为 int,然后再使用此代码将其传递给我的“最小”函数:

((= n 3)
 (begin  
   (display "\n\tOption 3.")
   (display "\nDisplay Roster by ID")
   (display "\nsmallest record is: ")
   (lambda (record) (* record record) 100)
   (smallest roster record)
   (menu roster)))

(define smallest
  (lambda (roster record) 
    ((append roster temp)
     (cond ((or (null? temp) (equals (length(temp)) 1)) record) 
           ((< (car(car temp)) (car(car(cdr temp)))) 
            (if (or (null? record) (> record (car(car temp)))) 
                (cons (car(car temp)) record) 
                record)
            (smallest (cdr temp) record))
           (else (smallest (cdr temp) record))))))

【问题讨论】:

  • 一般情况下,如果您发布图片的链接(例如,上传到 imgur),有足够代表的人会为您发布。
  • (lambda (record) (* record record) 100) 是一个未命名的函数,它对一个数字求平方,将其丢弃,然后返回 100。你永远不会将它用于任何事情。并且(append roster temp)(cons (car(car temp)) record) 创建 new 列表 - 没有任何内容被修改(或者如果存在名为“temp”的东西,则不会创建它们)。看起来您已经熟悉其他语言了;如果你假装不是,从头开始学习,学习 Scheme 会更容易。

标签: list sorting variables scheme


【解决方案1】:

在使用变量之前,您需要声明它(例如,使用let 或将其声明为您正在使用它的函数的参数)。我在你的代码中看到这一行:

(smallest roster record)

您在其中使用了 2 个未定义的变量(未绑定的变量),这就是您的 2 个错误的原因。

要解决,先用let声明变量,以后就可以使用了。

如果您不知道如何使用letlet*,请参阅:http://docs.racket-lang.org/reference/let.html

【讨论】:

  • 我试过这个但我得到错误';格式错误的特殊形式:(让(记录 1000)记录)'。我把'(让(记录1000)记录)'放在你看到'(lambda(记录)(*记录记录)100)'的地方
  • @SasheemSnell 这是(let ((record 1000) (other-variable other-value)) expression-that-uses-the-values)
  • @Sylwester 对不起,其他变量和其他值是什么意思?
  • @Sylwester 哦,我明白了,我的括号.. 谢谢
  • @SasheemSnell 我刚刚添加了第二个变量来显示括号......它的(let (bindings ...) body ...)
【解决方案2】:

免责声明

越来越多地,当我使用 Ableson 和 Sussman 的方法系统地构建程序时,我发现调试程序更容易......即从分层语言的角度思考。 YMMV。

实施

我使用了#lang racket,但在record:ID 上调用了一个标准的Scheme 函数来进行字符串比较。我提供了函数签名(虽然没有检查它们),因为实现在语言构建过程中使用了更高阶的函数。

#lang racket/base
(require srfi/13)

;;; Make a language for records

(define ID car)
(define name cadr)
(define grade caddr)

;; [any? any? -> boolean] [listof any? -> any?] -> [listof any? -> any?]
(define (make-record-compare-function predicate field)
  (lambda (record1 record2)
    (predicate (field record1) (field record2))))


;;; Make a language for comparing records
;;; This is a parital implementation

(define ID<?
  (make-record-compare-function string< ID))

;; record record -> record
(define (return-record-with-smaller-ID record1 record2)
  (if (ID<? record1 record2)
      record1
      record2))

;;; Make a language for searching rosters
;;; This is a partial implementation

;; [any? any? -> any?] -> [listof any? -> any?]
(define (make-roster-search comparator)
  (define  (inner roster best-match)
    (if (null? roster)
      best-match
      (inner (cdr roster)
             (comparator best-match
                         (car roster)))))
  (lambda (roster)
    (inner (cdr roster)
           (car roster))))

所有的魔法都发生在内部函数inner 中。它是 best-match 参数,包含当前找到的最小记录的本地状态。

用法

racket@29661598.rkt> (define record1 (list "02" "Sasheem" 23))
racket@29661598.rkt> (define record2 (list "34" "Ben" -42))
racket@29661598.rkt> (define smallest (make-roster-search
                       return-record-with-smaller-ID))
racket@29661598.rkt> (smallest (list record1 record2))
'("02" "Sasheem" 23)
racket@29661598.rkt> (smallest (list record2 record1))
'("02" "Sasheem" 23)
racket@29661598.rkt> (smallest (list record1 record1))
'("02" "Sasheem" 23)

【讨论】:

    猜你喜欢
    • 2012-10-04
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多