简体   繁体   English

方案-需要替换列表元素的值

[英]Scheme - Need to replace the value of a list element

My list grabs user input, and creates a list - this list is in characters. 我的列表获取用户输入,并创建一个列表-此列表以字符为单位。

I would like to be able to check if the (car myList) is a character like #\\1 or #\\2 , and then change the car of the list into 1 or 2. 我希望能够检查(car myList)是否为#\\1#\\2类的字符,然后将列表的car更改为1或2。

I am using DrRacket. 我正在使用DrRacket。

The problem so far has been attempting to call either (set! (car myList) 1) or (list-set! (car myList) 1 ) 到目前为止,问题一直在尝试调用(set! (car myList) 1)(list-set! (car myList) 1 )

Both are undefined references in my environment. 在我的环境中,两者都是未定义的引用。

I just started working with scheme today, for a university assignment. 我今天才刚开始与Scheme合作,以完成大学任务。

Any help would be greatly appreciated if anyone has time 如果有时间,任何帮助将不胜感激

Thanks 谢谢

By default, Racket does not provide mutable pairs, and thus no mutable lists either. 默认情况下,Racket不提供可变对,因此也没有可变列表。 That means that the values of pairs and lists are unchangeable. 这意味着对和列表的值不可更改。

However, you can (require racket/mpair) , which, as the name implies, provides mutable pairs. 但是,您可以(require racket/mpair) ,顾名思义,它提供可变对。 You then use mcons , mcar , mcdr , mlist , etc. instead of cons , car , cdr , list . 然后,您使用mconsmcarmcdrmlist等,而不是使用conscarcdrlist

The other answers are correct, but might not be what you want. 其他答案是正确的,但可能不是您想要的。 The more idiomatic Scheme/Racket way to do this would be to write a function that consumes the original input, and returns a new, separate list that has the modifications you want. 更为惯用的Scheme / Racket方法是编写一个使用原始输入的函数,并返回一个新的单独列表,该列表具有您想要的修改。 (This is strongly preferred, hence lists being immutable by default.) So, for instance, you might write (这是首选,因此默认情况下列表是不可变的。)因此,例如,您可以编写

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

Your program would then go something like 然后您的程序会像

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

Pairs in Scheme are mutable. Scheme中的对是可变的。 But you don't mutate them using (set! (car myList) 1 ) ; 但是,您不必使用(set! (car myList) 1 )对其进行变异。 rather, you would do (set-car! myList 1) . 相反,您会这样做(set-car! myList 1) You need to first find the pair that you want to mutate, and then call set-car! 您需要先找到要突变的对,然后再调用set-car! or set-cdr! set-cdr! on the pair (once you do car or cdr on it, that's just accessing the pair and not mutating it). 在配对上(一旦您在其上进行了carcdr操作,那只是访问配对而不会对其进行突变)。

I used a stack implementation from this site: 我从该站点使用了堆栈实现:

http://zoo.cs.yale.edu/classes/cs201/Fall_2007/materials/pdfs/stacks.pdf http://zoo.cs.yale.edu/classes/cs201/Fall_2007/materials/pdfs/stacks.pdf

The stack let me , well i guess "mirror" my list. 堆栈让我,好吧,我想我的列表是“镜像”。 after i checked what symbol the user input character was, i would just push an appropriate character onto my stack. 在检查了用户输入字符是什么符号之后,我只需将适当的字符压入堆栈。

(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)))
      )

  )

if anyone ever has similar questions on this, or about my code / functions, email me. 如果有人对此或我的代码/功能有类似问题,请给我发电子邮件。 ( i think my email is shown on my user page?) (我认为我的电子邮件显示在我的用户页面上了吗?)

i also have a pseudo code algorithm for conversion of infix to post fix notation (that was the assignment here) 我也有一个伪代码算法,用于将中缀转换为后缀表示法(这是此处的工作)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM