2015-10-03 2 views
1

Мне нужна помощь в понимании синтаксиса о том, как добавить число в список, я делаю это из пользовательского ввода через консоль, чтобы эти элементы нужно вводить рекурсивно. Таким образом, для любого числа, которое вводится, список должен расти для каждого элемента (только числа).Добавление элементов в существующий список в схеме

Вот код, с которым я работаю, проблема заключается в втором условии. Сейчас это работает, но только создает пустой список каждого номера я ставлю в, так что результаты будут

>12 
>202 
>30 
()()() 
zero input: stopping list 


(define (inputlist) 
(let ((applist list)) 
(let ((inpt (read))) 
    (cond 
    ((= inpt 0)(newline) (display "zero input: stopping list")) 
    ;;OLD((number? inpt) (cons inpt applist) (display (applist))(inputlist)) 
    ((number? inpt) (append (applist)(list inpt)) (display (applist))(inputlist)) 
    (else 
    display "Not a number"))))) 

Я понимаю, почему против не делать то, что мне нужно, чтобы это было делать, но есть аналогичные функциональные возможности добавить каждый элемент read в элемент в уже существующий список?

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

ВТОРОЙ РЕДАКТИРОВКА: Я понял, почему это печатает несколько(), потому что он вызывается из стека при вводе 0, поэтому я уверен, что он не работает, потому что добавление не работает так, как предполагалось, Я отобразил приложение в условном выражении 0 и возвращает один нулевой список.

ответ

1

Простой способ добавить элемент в конец списка в то время как цикл будет сделать позвонить append и обновить ссылку на список позже:

(set! applist (append applist (list inpt))) 

Обратите внимание, что у вас есть несколько неуместны скобок - в ваш код отсутствует, некоторые из них не нужны. На схеме () означает приложение-приложение, и вы должны быть осторожны, когда вы кладете эти скобки.

Кроме того, имейте в виду, что append не изменяет первоначальный список, он создает новый, и если вам нужно сослаться на него, вы должны его где-то сохранить (именно поэтому я делаю set! выше) ,

С вами связаны более серьезные ошибки. Условия находятся в неправильном порядке (вам нужно проверить, является ли ввод числом, прежде чем спрашивать, равен ли он нулю), и вы забыли цикл, если введено что-то, кроме номера. Кроме того, если мы пройдем по списку в качестве параметра в цикле, нам не придется делать уродливые set!. Попробуйте вместо этого, это ближе к тому, что вы были нацелены на:

(define (inputlist) 
    (let loop ((applist '())) 
    (let ((inpt (read))) 
     (cond ((not (number? inpt)) 
      (display "not a number") 
      (newline) 
      (loop applist)) 
      ((zero? inpt) 
      (display "zero input: stopping list")) 
      (else 
      (let ((new-applist (append applist (list inpt)))) 
       (display new-applist) 
       (newline) 
       (loop new-applist))))))) 

Как уже упоминалось в комментариях, имейте в виду, что добавление в конец списка внутри цикла в целом это плохая идея. Это нормально для учебных целей, но в реальном коде вам будет cons во главе списка и reverse он в конце - это более эффективно.

+0

Если я не скобки applist, я получаю выброшен ошибки, потому что INPT и applist не в то же самое время, или, по крайней мере, один из них становится называемый Frontier

+0

Итак, у меня возникли проблемы с пониманием того, что я бросаю, когда я звоню в переменную или список, я получал эту ошибку для , будь то список или чтение или что вы, это из-за чрезмерной скобки? Что я там делаю неправильно? – Frontier

+0

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

1

Обратите внимание, что (cons x xs) где x - это элемент, а xs - список, создающий новый список, который имеет x в качестве своего первого элемента.

Вот один из способов, чтобы использовать против, чтобы добавить элемент в конец списка:

Пример: Добавить 4 к (1 2 3) 1. Обратный список: (3 2 1) 2. Добавить 4 спереди: (4 3 2 1) 3.Реверс: (1 2 3 4)

> (reverse (cons 4 (reverse (list 1 2 3))) 
(1 2 3 4) 

функция, которая использует этот принцип:

(define (cons-to-back x xs) 
    (reverse (cons x (reverse xs)))) 

> (cons-to-back 4 (list 1 2 3)) 
(1 2 3 4) 

В качестве альтернативы можно использовать append, который добавляет элементы двух списков:

> (append '(1 2 3) '(4 5 6)) 
(1 2 3 4 5 6) 

Все, что нам нужно сделать, относится к элементу в список перед использованием append:

> (append '(1 2 3) (list 4)) 
'(1 2 3 4) 

Альтернативное определение cons-to-back:

(define (cons-to-back x xs) 
    (append xs (list x)))