在列表中显示for-each的元素

时间:2014-04-07 05:09:41

标签: scheme

我有一大堆较小的3元素列表,如下所示:

( ("001" "Bob" 80) ("002" "Sam" 85) ("003" "Aaron" 94) etc . . .)

我试图创建类似的东西:

No.1: ID=001, Name=’’Bob’’, Grade=80
No.2: ID=002, Name=’’Sam’’, Grade=85
No.3: ID=003, Name=’’Aaron’’, Grade=94

我只能访问显示和for-each(没有" for"或" printf"功能)

我一直在尝试创建一个for-each函数来获取列表并且:

伪码:

for-each list in list
display "ID=(car list)"
display "Name ="(cadr list)" "
etc

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

那么,你的口译员毕竟没有printf?这太可惜了。我们可以手动获得所需的输出,这有点麻烦,但这应该适用于大多数Scheme解释器,注意需要额外的程序来跟踪索引:

(define lst
  '(("001" "Bob" 80) ("002" "Sam" 85) ("003" "Aaron" 94)))

(define (add-index lst)
  (let loop ((lst lst) (idx 1))
    (if (null? lst)
        '()
        (cons (cons idx (car lst))
              (loop (cdr lst) (+ idx 1))))))

(for-each (lambda (e)
            (display "No.")
            (display (car e))
            (display ": ID=")
            (display (cadr e))
            (display ", Name=’’")
            (display (caddr e))
            (display "’’, Grade=")
            (display (cadddr e))
            (newline))
          (add-index lst))

打印出所需的结果:

No.1: ID=001, Name=’’Bob’’, Grade=80
No.2: ID=002, Name=’’Sam’’, Grade=85
No.3: ID=003, Name=’’Aaron’’, Grade=94

答案 1 :(得分:0)

这是另一个版本。它避免构建临时列表。

(define lst
  '(("001" "Bob" 80) ("002" "Sam" 85) ("003" "Aaron" 94)))

(define (print-list lst)

  (define (display-one-item item index)
    (display "No.")
    (display index)
    (display ": ID=")
    (display (car item))
    (display ", Name=’’")
    (display (cadr item))
    (display "’’, Grade=")
    (display (caddr item))
    (newline))

  (define (helper in index)
     (if (not (null? in))
        (begin
          (display-one-item (car in) index)
          (helper (cdr in) (+ index 1))
        )))
  (helper lst 0))

  (print-list lst)