我想定义一个列表操作,它以列表和2个函数作为输入。让我更简洁一点。这是我将要实现的功能。
这是我将使用的列表:
(define student-table '(students (name id gpa) (ali 1 3.2) (ayse 2 3.7)))
我定义了一些功能。
(define (get table row field)
(nth (list-index field (cadr student-table)) row)
)
(define (alter table row fields-values)
(cond
((= (length fields-values) 0) row)
((> (length fields-values) 0)
(list-with row (list-index (car (car fields-values)) (cadr student-table)) (cadr (car fields-values)))
(alter table (list-with row (list-index (car (car fields-values)) (cadr student-table)) (cadr (car fields-values))) (cdr fields-values)))))
这是我想要实现的功能
(define (update-rows table predicate change))
所以,如果我打电话给我,我会期待这个结果。
> (update-rows student-table (lambda (table row) (eq? (get table row 'name) 'ali)) (lambda (table row) (alter table row '((gpa 3.3))))) => '(students (name id gpa) (ali 1 3.3) (ayse 2 3.7)))
答案 0 :(得分:1)
看起来你已经拥有了大部分内容。填写update-rows
这样的内容:
(define (update-rows table predicate change)
;; Look through all the rows
(let looking ((rows (cddr table)))
(unless (null? rows)
;; Handle the next row
(let ((row (car rows)))
(when (predicate table row)
(change table row)))
;; Continue looking at the rest
(looking (cdr rows))))
答案 1 :(得分:0)
我无法检查这是否有效,因为我没有list-index
或list-with
。我希望change
能够评估一个可以替换当前行的元素。
(define (update-rows table predicate change)
(cons* (car table) ; keep header
(cadr table) ; column symbols
;; process the rest
(map (lambda (row)
(if (predicate table row)
(change table row)
row))
(cddr table))))
cons*
在R6RS中定义。在一些Scheme实现(和Common Lisp)中,它被称为list*