Scheme - 需要替换list元素的值

时间:2011-11-20 03:06:26

标签: list variables scheme element racket

我的列表抓取用户输入,并创建一个列表 - 此列表以字符显示。

我希望能够检查(car myList)#\1#\2之类的字符,然后将列表中的汽车更改为1或2。

我正在使用DrRacket。

到目前为止,问题是尝试调用(set! (car myList) 1)(list-set! (car myList) 1 )

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

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

如果有人有时间,我们将非常感谢任何帮助

由于

4 个答案:

答案 0 :(得分:7)

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

但是,你可以(require racket/mpair),顾名思义,它提供了可变对。然后,您使用mconsmcarmcdrmlist等代替conscarcdr,{ {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!(一旦您对carcdr进行调整,那就是访问该对而不是改变它。)

答案 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)))
      )

  )

如果有人对此有任何类似的问题,或者我的代码/功能,请给我发电子邮件。 (我想我的电子邮件会显示在我的用户页面上?)

我还有一个伪代码算法,用于将中缀转换为修复后符号(这是此处的赋值)