我的方案程序中有2个未绑定的变量错误

时间:2015-04-15 21:53:02

标签: list sorting variables scheme

我对我在计划中获得的两个未绑定的变量错误有疑问:&#39 ;;未绑定的变量:temp'和&#39 ;;未绑定变量:记录'。

我最终试图通过ID按升序排序我的名单(学生信息列表,每个元素是一个子列表)。名单的每个子列表包含3个元素:ID号(数字串),名称(字符串)和等级(int)作为其自己的列表。 ID号是名册中每个子列表的第一个元素。目前我正在制作一个最小的'辅助函数返回名册中所有子列表的最小ID号(作为记录)。

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

我最小的目标'目前是将名册附加到当地的变量“临时”。因为我不希望名单在从函数返回时发生变化。在我能做到这一点之前,我必须得到我的&#39 ;;未绑定变量:record'我尝试将记录定义为一个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))))))

2 个答案:

答案 0 :(得分:0)

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

(smallest roster record)

你使用2个未定义的变量(未绑定的变量),这就是你2个错误的原因。

要解决此问题,请先使用let声明变量,然后再使用它们。

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

答案 1 :(得分:0)

声明

当我使用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)