Схема создания списка - PullRequest
2 голосов
/ 03 апреля 2012

Здравствуйте, вот мой вопрос.

Я хочу создать 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))

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

Ответы [ 4 ]

0 голосов
/ 03 апреля 2012

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

(define itemL (filter item? OriginalL))
(define nodeL (filter (compose not item?) OriginalL))
0 голосов
/ 03 апреля 2012

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

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

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

0 голосов
/ 03 апреля 2012

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

Я сделал несколько правок (хотя потребуетсяждать модерации).

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

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

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

0 голосов
/ 03 апреля 2012

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

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

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

...