我的列表抓取用户输入,并创建一个列表 - 此列表以字符显示。
我希望能够检查(car myList)
是#\1
或#\2
之类的字符,然后将列表中的汽车更改为1或2。
我正在使用DrRacket。
到目前为止,问题是尝试调用(set! (car myList) 1)
或(list-set! (car myList) 1 )
两者都是我环境中未定义的引用。
我刚刚开始参与计划,参加大学任务。
如果有人有时间,我们将非常感谢任何帮助
由于
答案 0 :(得分:7)
默认情况下,Racket不提供可变对,因此也没有可变列表。这意味着对和列表的值是不可更改的。
但是,你可以(require racket/mpair)
,顾名思义,它提供了可变对。然后,您使用mcons
,mcar
,mcdr
,mlist
等代替cons
,car
,cdr
,{ {1}}。
答案 1 :(得分: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]))
你的程序会像
那样(let* ([input (read-input-from-the-user)]
[processed-list (numberify-head input)])
;; ... code that uses processed-list ...
)
答案 2 :(得分:0)
Scheme中的对是可变的。但是你不要使用(set! (car myList) 1 )
来改变它们;相反,你会做(set-car! myList 1)
。您需要首先找到要变异的对,然后在对上调用set-car!
或set-cdr!
(一旦您对car
或cdr
进行调整,那就是访问该对而不是改变它。)
答案 3 :(得分:0)
我使用了此站点的堆栈实现:
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)))
)
)
如果有人对此有任何类似的问题,或者我的代码/功能,请给我发电子邮件。 (我想我的电子邮件会显示在我的用户页面上?)
我还有一个伪代码算法,用于将中缀转换为修复后符号(这是此处的赋值)