我对我在计划中获得的两个未绑定的变量错误有疑问:&#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))))))
答案 0 :(得分:0)
在使用变量之前,您需要声明它(例如,使用let
或将其声明为您正在使用它的函数的参数)。我在你的代码中看到这一行:
(smallest roster record)
你使用2个未定义的变量(未绑定的变量),这就是你2个错误的原因。
要解决此问题,请先使用let
声明变量,然后再使用它们。
如果您不知道如何使用let
或let*
,请参阅: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)