List 如何在scheme中更改列表的值

List 如何在scheme中更改列表的值,list,racket,List,Racket,我想更改列表的number的值,但它总是显示 设定!:在:(汽车(cdr(汽车a)))中没有标识符 我不知道该怎么办,谁能帮我?谢谢你 (define a (list (list burnie 236.67) (list launceston 163.66))) (define-syntax-rule (myset-car! lst val) (if (not (list? lst)) lst (set! lst (cons val (cdr lst))))) (d

我想更改列表的number的值,但它总是显示 设定!:在:
(汽车(cdr(汽车a)))中没有标识符
我不知道该怎么办,谁能帮我?谢谢你

(define a (list (list burnie 236.67) (list launceston 163.66)))
(define-syntax-rule (myset-car! lst val)
  (if (not (list? lst))
      lst
      (set! lst (cons val (cdr lst)))))

(define update_gn
  (lambda (a)
    (cond
      ((null? a) #t)
      (else
      (myset-car! (car (cdr (car a))) (+ (car (cdr (car a))) (car new_gn)))
      (update_gn (cdr a) )))))

如果您想以这种方式进行更新,您应该真正使用向量,而不是列表

对于列表,您应该使用功能性更强的方法,即使用高阶函数迭代列表并返回新列表。例如,要在每个子列表的第二个元素中添加10:

>(定义(列表“burnie 236.67”(列表“launceston 163.66)))
>a
“((伯尼236.67)(朗塞斯顿163.66))
>(地图(lambda(lst)(列表(汽车lst)(+(cadr lst)10))a)
“((伯尼246.67)(朗塞斯顿173.66))
>a;尚未修改
“((伯尼236.67)(朗塞斯顿163.66))
>(集合!a(地图(lambda(lst)(列表(汽车lst)(+(cadr lst)10))a))
>a;已被修改
“((伯尼246.67)(朗塞斯顿173.66))

不能在#中变异成对!因为他们在偏离计划后使其不可更改,所以对(语言)进行了抨击。如果您在Racket(应用程序)中使用Scheme语言,您将能够执行以下操作:

#!r6rs
(导入(rnrs)(rnrs可变对))
(定义测试列表(列表“burnie 236.67”(列表“launceston 163.66)))
(定义新gn(列表10));我不确定这到底是什么,但程序预计这是一对数字汽车。
(定义(更新gn lst)
(续)
((空?lst)#t)
(其他
(设置车辆!(cdar lst)(+(cadar lst)(车辆新gn)))
(更新gn(cdr lst(())))
(更新gn测试列表)
测试列表;==>((伯尼246.67)(朗塞斯顿173.66))
现在,在#中确实有可变对!Racket(语言),但您需要使用
mcons
mcar
mcdr
,它们是
mpair?
而不是
pair?
。您需要像这样拥有
cadar
(定义mcadar(compose mcar mcdr mcar))
,并且您使用的大多数高阶函数不支持它们,因此您必须自己创建。。这使它非常痛苦,这是故意的。当我发现我需要可变对时,我通常会将语言更改为R6RS(标准方案)