Как мне обновить список в Шеме.Я имею в виду постройку предметов по заранее существующему списку, по одному, использую автомобиль - PullRequest
0 голосов
/ 31 января 2019

Учитывая следующее в качестве входных данных для процедуры Scheme.

( define Ls ( list 'Apple 'Peach 'Pear 'Plum ) ) 
( define NewLs ( list '***HEAD ))

Это вывод, который мне нужно получить

( define Ls ( List 'Apple 'Peach 'Pear 'Plum ) ) 
( define NewLs ( List '***HEAD 'Apple 'Peach 'Pear 'Plum ) ) 

Мне нужно добавить элементы из LS в NewL, ноодин за раз.

Я попробовал, добавить, добавить!установить и установить!

( define Ls ( list 'Apple 'Peach 'Pear 'Plum ) )
( define NewLs ( list '***HEAD ) )
;;;
( define Update_List
   ( lambda ( Ls ) 
     ( cond
          (( null? Ls ) 
             ( begin 
                ( display "\n\n ** END OF INPUT LIST *** \n\n" ) 
                ( quote() )))
          ( else
             ( begin
                ( append! NewLs ( car Ls ) )
                ( Update_List ( cdr Ls ) ) ) ) ) )
;;;
;;;
(Update_List Ls )
( exit )      

Я ожидаю увидеть это

NewLs ( '***HEAD 'Apple 'Peach 'Pear 'Plum )

1 Ответ

0 голосов
/ 01 февраля 2019

Я думаю, вы можете сделать это сложнее, чем нужно;в Scheme-ish, стиле функционального программирования, мы получаем новые списки из существующих списков, используя такие функции, как cons.

Кроме того, при написании в стиле функционального программирования мы обычно не используем destructive-updateвиды функций, такие как append!, или любые из этих "!"functions.

Вы на правильном пути, но попробуйте подумать о проблеме с точки зрения получения нового списка из существующих списков: попробуйте написать функцию, которая принимает два списка ввода, скажем, l1 и l2и создает список, который состоит из всех элементов в l1, за которыми следуют все элементы в l2.Ваша Update_List функция, показанная выше, показывает, что вы все еще думаете о проблеме с точки зрения императивного программирования, включая деструктивное обновление, и обычно это не так, как это делается в Схеме (и в функциональном программировании в целом.)

Я знаю, что это не прямой ответ на ваш вопрос, но кажется, что это может быть домашнее задание, и я надеюсь, что это даст вам некоторые подсказки о том, с чего начать / возобновить свою работу в поисках решения.Немного потрудившись найти ответ, принципы становятся лучше, и вы лучше их изучаете таким образом.

Отредактировано:

Мои извинения перед вами: я подумал, что вы, возможно, являетесь студентом, работающим наддомашнее задание, но потом я увидел ваш другой вопрос здесь !

Я все же призываю вас подумать над тем, что я сказал выше, прежде чем читать дальше, потому что обучение происходит с борьбой.

ТАК: не читайте дальше, прежде чем действительно усердно подумать над тем, что я предложил выше.




Вот как я бы написалфункция, подобная той, что я описал выше:

(define append-lists
  (lambda (l1 l2) 
    (cond ((null? l1) l2)) ; if l1 is empty, then l2 is the "answer"
          (else 
           ; cons-truct a new list with the (car l1) 
           ; and the result of appending l2 to the 
           ; rest of l1, i.e., (cdr l1)
                (cons (car l1) 
                      (append-lists (cdr l1) l2) ) ) ) ) ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...