【问题标题】:Scheme - Need to replace the value of a list element方案 - 需要替换列表元素的值
【发布时间】:2011-11-20 03:06:26
【问题描述】:
我的列表获取用户输入,并创建一个列表 - 此列表以字符为单位。
我希望能够检查(car myList)是否是#\1或#\2之类的字符,然后将列表中的汽车更改为1或2。
我正在使用 DrRacket。
目前的问题是尝试调用(set! (car myList) 1) 或(list-set! (car myList) 1 )
在我的环境中,两者都是未定义的引用。
我今天刚开始使用 scheme,完成大学作业。
如果有人有时间,任何帮助将不胜感激
谢谢
【问题讨论】:
标签:
list
variables
scheme
element
racket
【解决方案1】:
默认情况下,Racket 不提供可变对,因此也不提供可变列表。这意味着对和列表的值是不可更改的。
但是,您可以(require racket/mpair),顾名思义,它提供可变对。然后使用mcons、mcar、mcdr、mlist 等代替cons、car、cdr、list。
【解决方案2】:
其他答案是正确的,但可能不是您想要的。更惯用的 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]))
你的程序会变成这样
(let* ([input (read-input-from-the-user)]
[processed-list (numberify-head input)])
;; ... code that uses processed-list ...
)
【解决方案3】:
Scheme 中的对是可变的。但是你不能使用(set! (car myList) 1 ) 来改变它们;相反,你会做(set-car! myList 1)。您需要首先找到您想要变异的对,然后在该对上调用set-car! 或set-cdr!(一旦您对它执行car 或cdr,这只是访问该对而不是对其进行变异) .
【解决方案4】:
我使用了这个站点的堆栈实现:
http://zoo.cs.yale.edu/classes/cs201/Fall_2007/materials/pdfs/stacks.pdf
堆栈让我,我猜“镜像”我的列表。在我检查了用户输入字符是什么符号后,我只需将一个适当的字符压入我的堆栈。
(define (makeListFromSymbols myList)
(display "Length of List = ")
(display(length myList)) (newline)
(cond
((null? myList)
(display "LIST IS NULL")(newline)
(popTheRestOfStack)
)
((eq? #\0 (car myList))
(display "Equals 0")
(stackForExpression 'push! #\0)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\1 (car myList))
(display "Equals 1")
(stackForExpression 'push! #\1)
(makeListFromSymbols(cdr myList) )
(newline)
)
((eq? #\2 (car myList))
(display "Equals 2")
(stackForExpression 'push! #\2)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\3 (car myList))
(display "Equals 3")
(stackForExpression 'push! #\3)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\4 (car myList))
(display "Equals 4")
(stackForExpression 'push! #\4)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\5 (car myList))
(display "Equals 5")
(stackForExpression 'push! #\5)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\6 (car myList))
(display "Equals 6")
(stackForExpression 'push! #\6)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\7 (car myList))
(display "Equals 7")
(stackForExpression 'push! #\7)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\8 (car myList))
(display "Equals 8")
(stackForExpression 'push! #\8)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\9 (car myList))
(display "Equals 9")
(stackForExpression 'push! #\9)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\+ (car myList))
(display "Equals +")
(handleAdditionOperator)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\/ (car myList))
(display "Equals /")
(handleDivisionOperator)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\- (car myList))
(display "Equals -")
(handleSubtractionOperator)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\* (car myList))
(display "Equals *")
(handleMultiplicationOperator)
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\( (car myList))
(display "Equals (")
(stack1 'push! #\( )
(makeListFromSymbols(cdr myList))
(newline)
)
((eq? #\) (car myList))
(display "Equals )")
(popAndTransferUntilLeftBracket)
(makeListFromSymbols(cdr myList))
(newline)
)
(else (display "Character is invalid")(newline) (makeListFromSymbols(cdr myList)))
)
)
如果有人对此或我的代码/功能有类似的问题,请给我发电子邮件。 (我认为我的电子邮件显示在我的用户页面上?)
我还有一个用于将中缀转换为后缀表示法的伪代码算法(这是这里的赋值)