2012-04-02 2 views
2

Привет, вот мой вопрос.Схема Создание списка

Я хочу создать 2 подгруппы списков из исходного списка следующим

OriginalL '((item1)(item2)(item3)(node1)(node2)(item4)) ;its a list of lists 

Списки я хочу создать

itemL '((item1)(item2)(item3)(item4)) ;only contains item type 
nodeL '((node1)(node2)) ;only contains node type 

Вот моя функция, которая не работает правильно

(define itemL null) 

(define nodeL null) 

(define (separate OriginalL) 
    (map (lambda (i) 
      (if (item? i) 
       (cons itemL i) 
       (cons nodeL i)) 
     OrignalL)) 

Но по какой-то причине я не могу получить список, как я хочу. в чем проблема. товар? просто возвращает #t или #f по типу элемента в исходном списке.
Спасибо

+0

Пожалуйста, обратите внимание переформатирования кода, чтобы сделать его более удобным для чтения с помощью инструментов редактирования. –

ответ

0

Вот простой способ решить проблему:

(define itemL (filter item? OriginalL)) 
(define nodeL (filter (compose not item?) OriginalL)) 
0

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

(define itemL '()) 
(define nodeL '()) 
(define (separate OriginalL) 
    (map (lambda (i) 
    (if (item? i) 
     (append! itemL i) 
     (append! nodeL i)) 
    OrignalL)) 


Если схема, что вы используете не поддерживает append! вы можете написать его самостоятельно. Например, см: Append! in Scheme?

+0

Разве вы не подразумеваете 'append!' В этом случае? – leppie

+0

да, это то, что я хочу сделать. Но он все еще дает пустой список для itemL и nodeL. После отдельного. вы проверили этот код? – user1233092

+0

@ user1233092: Ваша схема может поддерживать 'append!'. Попробуйте, иначе напишите :) Это тривиальный прок. – leppie

0

Если вы используете R6RS, вы можете просто сделать следующее:

(let-values (((a b) (partition item? OriginalL)) 
    (set! itemL a) 
    (set! nodeL b)) 

Многие другие схемы будет поддерживать то же самое. Возможно, посмотрите поддержку SRFI1.

0

Прошу прощения за отправку отдельного ответа, но я никогда не использую эту учетную запись, поэтому у меня нет комментариев, чтобы прокомментировать Justin Ethiers one.

Есть несколько исправлений, которые я сделал (хотя он должен будет ждать умеренности).

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

Во-вторых, вторым аргументом для append! должен быть список.

В-третьих, если вам не нужно собирать список результатов, for-each понятнее, чем map.

+0

Я бы также предлагал неоднократно добавлять, но эффективность - это еще одна проблема :) –

Смежные вопросы