Scheme - 需要替换list元素的值

jor*_*dan 0 variables scheme element list racket

我的列表抓取用户输入,并创建一个列表 - 此列表以字符为单位.

我想能够检查是否(car myList)是一个性格像#\1或者#\2,然后更改名单的车进1或2.

我正在使用DrRacket.

到目前为止,这个问题一直试图打电话给(set! (car myList) 1)(list-set! (car myList) 1 )

两者都是我环境中未定义的引用.

我刚刚开始参与计划,参加大学任务.

如果有人有时间,任何帮助将不胜感激

谢谢

Chr*_*ung 7

默认情况下,Racket不提供可变对,因此也没有可变列表.这意味着对和列表的值是不可更改的.

但是,您可以(require racket/mpair),顾名思义,它提供可变对.然后使用mcons,mcar,mcdr,mlist,等来代替cons,car,cdr,list.


jac*_*obm 5

其他答案是正确的,但可能不是你想要的.更惯用的Scheme/Racket方法是编写一个消耗原始输入的函数,并返回一个具有所需修改的新的单独列表.(这是强烈优选的,因此默认情况下列表是不可变的.)因此,例如,您可能会写

(define (numberify-head lst)
  (cond
    [(eq? (car lst) #\1) (cons 1 (cdr lst))]
    [(eq? (car lst) #\2) (cons 2 (cdr lst))]
    [else lst]))
Run Code Online (Sandbox Code Playgroud)

然后你的程序会像

(let* ([input (read-input-from-the-user)]
       [processed-list (numberify-head input)])
  ;; ... code that uses processed-list ...
  )
Run Code Online (Sandbox Code Playgroud)