【问题标题】: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),顾名思义,它提供可变对。然后使用mconsmcarmcdrmlist 等代替conscarcdrlist

    【讨论】:

      【解决方案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!(一旦您对它执行carcdr,这只是访问该对而不是对其进行变异) .

        【讨论】:

          【解决方案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)))
                )
          
            )
          

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

          我还有一个用于将中缀转换为后缀表示法的伪代码算法(这是这里的赋值)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-05-24
            • 2011-07-23
            • 2018-11-05
            • 1970-01-01
            • 1970-01-01
            • 2012-08-01
            • 1970-01-01
            相关资源
            最近更新 更多