如何将2个参数作为Scheme中的函数?

时间:2014-05-12 15:54:31

标签: functional-programming scheme

我想定义一个列表操作,它以列表和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)))

2 个答案:

答案 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-indexlist-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*