每个人,我正在制作将我的自定义对象作为参数的函数,然后从该对象的列表中获取第一个参数,返回它并从对象中删除它。代码是:
(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
在不更改对象的情况下返回值。
你能帮我解决问题吗?
此外,是否可以从该列表中剪切元素而无需在函数中创建新元素?
答案 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