Схема - необходимо заменить значение элемента списка - PullRequest
0 голосов
/ 20 ноября 2011

Мой список захватывает ввод пользователя и создает список - этот список состоит из символов.

Я бы хотел иметь возможность проверить, является ли (car myList) символ типа #\1 или #\2, а затем изменить автомобиль в списке на 1 или 2.

Я использую DrRacket.

Проблема до сих пор пытается вызвать либо (set! (car myList) 1) или (list-set! (car myList) 1 )

Обе являются неопределенными ссылками в моей среде.

Я только начал работать со схемой сегодня для университетского назначения.

Любая помощь будет принята с благодарностью, если у кого-то будет время

Спасибо

Ответы [ 4 ]

7 голосов
/ 20 ноября 2011

По умолчанию Racket не предоставляет изменяемые пары и, следовательно, не содержит изменяемых списков.Это означает, что значения пар и списков неизменяемы.

Однако вы можете (require racket/mpair), что, как следует из названия, предоставляет изменяемые пары.Затем вы используете mcons, mcar, mcdr, mlist и т. Д. Вместо cons, car, cdr, list.

5 голосов
/ 20 ноября 2011

Другие ответы верны, но могут не соответствовать вашим ожиданиям.Более идиоматический способ Схемы / Ракетки сделать это - написать функцию, которая использует исходный ввод и возвращает новый отдельный список, в котором есть нужные вам модификации.(Это настоятельно рекомендуется, поэтому списки являются неизменяемыми по умолчанию.) Так, например, вы можете написать

(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 ...
  )
0 голосов
/ 22 ноября 2011

Я использовал реализацию стека с этого сайта:

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

  )

если у кого-то возникнут подобные вопросы по этому поводу или по поводу моего кода / функций, напишите мне. (я думаю, что мой адрес электронной почты отображается на моей странице пользователя?)

У меня также есть алгоритм псевдокода для преобразования инфикса в нотацию после исправления (это было назначение здесь)

0 голосов
/ 20 ноября 2011

Пары в схеме изменчивы.Но вы не изменяете их, используя (set! (car myList) 1 );скорее, вы бы сделали (set-car! myList 1).Сначала вам нужно найти пару, которую вы хотите изменить, а затем вызвать set-car! или set-cdr! для пары (как только вы сделаете для нее car или cdr, это просто доступ к паре, а не ее изменение).

...