有什么办法可以在方案中使用 cons 来制作 lat 吗?

Is there any way to make a lat using cons in scheme?

我正在使用这段简单的代码构建一个数字列表:

#lang scheme

(define pseudofizzbuzz (lambda (x)
             (cond
               ((zero? x) (quote ()))
               ((or (integer? (/ x 3)) (integer? (/ x 5))) (cons (quote ()) (pseudofizzbuzz (- x 1))))
               (else (cons x (pseudofizzbuzz (- x 1)))))))

(define reverselist (lambda (lat)
                  (cond
                    ((null? lat) (quote ()))
                    (else
                     (cons (reverselist (cdr lat)) (list (car lat))))))) 


(reverselist (pseudofizzbuzz 10))

我得到的结果是:

 ((((((((((() 1) 2) ()) 4) ()) ()) 7) 8) ()) ())

但我想要的当然是:

(1 2 4 7 8)

scheme有什么办法吗?我正在使用 DrRacket。

已经找到答案:

 (define (flatten x)
    (cond ((null? x) '())
          ((not (pair? x)) (list x))
          (else (append (flatten (car x))
                        (flatten (cdr x))))))

使用 (cons an-element a-list) 用新元素扩展 a-list an-element:

#lang racket

(define pseudofizzbuzz
  (lambda (x)
    (cond
      ((zero? x)
       (quote ()))
      ((or (integer? (/ x 3)) (integer? (/ x 5)))
       (pseudofizzbuzz (- x 1)))
      (else
       (cons x (pseudofizzbuzz (- x 1)))))))

(define reverselist
  (lambda (lat)
    (cond
      ((null? lat) 
       (quote ()))
      (else        
       (cons (reverselist (cdr lat)) (list (car lat))))))) 

(pseudofizzbuzz 10)

这会以相反的顺序生成结果,因此

(reverse (pseudofizzbuzz 10))

将以正确的顺序为您提供元素。