2016-12-28 3 views
1

Я хочу, чтобы иметь возможность собирать несколько списков внутри цикла.Lisp: собрать несколько списков в цикле

Я знаю, что это можно сделать без цикла, однако мне было интересно, возможно ли это с помощью цикла. Я хотел бы что-то вроде этого:

(loop for var in list 
     (if (cond1 var) 
      (if (cond2 var) 
       collect into list1 
       collect into list2)) 
     finally (list list1 list2)) 

Я получаю ошибку, что LOOP keyword is expected, я предполагаю, что собирать следует использовать сразу после when или loop. Есть ли способ решить это?

ответ

3

У вас есть несколько проблем.

Во-первых, если вы хотите поместить обычный код Lisp в тело цикла, вам понадобится ключевое слово do. Но вместо этого вы можете использовать dowhen или if.

Во-вторых, ключевое слово collect требует указать выражение для сбора в списке, например. collect var into list1.

В-третьих, вам необходимо использовать (return expression), чтобы вернуть значение из формы в предложении finally.

(loop for var in list 
    when (cond1 var) 
     if (cond2 var) 
     collect var into list1 
     else 
     collect var into list2 
    finally (return (list list1 list2))) 
+0

Оба ответа велики, но это то, что мне нужно, чтобы все это бежало! спасибо –

2

Верьте или нет, у вас есть слишком много круглых скобок. loop имеет свой маленький подъязык, который сильно отличается от s-выражений Common Lisp.

(loop :for var :in list 
     :when (cond1 var) 
     :if (cond2 var) 
      :collect var :into list1 
     :else 
      :collect var :into list2 
     :end 
     :end 
     :finally (return (list list1 list2))) 

Кроме того, я указать, что :collect и :finally только оценивает, так что вы должны использовать (return ...) или же вы можете ожидать nil.

Я использую ключевые слова для loop ключевых слов, чтобы отличить их от других символов. Это просто стиль. Отступ, конечно, игнорируется и просто для удобочитаемости, но :end нет. Однако в этом случае ключевые слова :end являются избыточными, так как loop корректно анализируется без них.

Я не буду ни в коем случае в loop .. Каждый профессионал время я получаю что-то немного сложное, я предпочитаю использовать Land of Lisp «s Периодическую таблицу или Loop for black belts, главу из Practical Common Lisp.

Periodic table of Loop Macro