从Scheme

时间:2017-10-16 14:15:24

标签: scheme racket

每个人,我正在制作将我的自定义对象作为参数的函数,然后从该对象的列表中获取第一个参数,返回它并从对象中删除它。代码是:

(define (make-source sequence . xs)
  (let ((a (if (not (null? xs))
               xs
               (list #f))))
    (cond ((string? sequence) (append (string->list sequence) (list a)))
          ((vector? sequence) (append (vector->list sequence) (list a)))
          (else (append sequence (list a))))))

(define (next src)
  (if (equal? (car src) '(#f))
      #t
      (let ((a (car src)))
        (set! src (make-source (cdr src)))
        a)))

问题是next在不更改对象的情况下返回值。 你能帮我解决问题吗? 此外,是否可以从该列表中剪切元素而无需在函数中创建新元素?

1 个答案:

答案 0 :(得分:1)

set!改变绑定而不是变量指向的对象。几乎所有今天的编程语言都是如此:

def f(a):
  a = 10

x = 20
f(x)
x
// => 20

为什么x 10不能解答为什么next不会更改对象的答案。变量实际上已设置,但它是局部变量,它在函数末尾停止存在。

在Scheme中编程的惯用方法不是尝试实现OO,而是使用map或折叠来对您的结构执行某些操作。例如。

(define (sum-numbers lst)
  (foldl + 0 lst))

(sum-number '(1 2 3))
; ==> 6