Система условия языка Common LISP для передачи управления

Я допущу право впереди, что следующее является довольно ужасным описанием того, что я хочу сделать. Извинения заранее. Задайте вопросы, чтобы помочь мне объяснить.:-)

Я записал ETLs (Извлечение, Преобразуйте, Загрузка) на других языках, которые состоят из отдельных операций, которые смотрят что-то как:

// in class CountOperation
IEnumerable<Row> Execute(IEnumerable<Row> rows) {
    var count = 0;
    foreach (var row in rows) {
        row["record number"] = count++;
        yield return row;
    }
}

Затем Вы представляете много этих операций в виде строки вместе и вызываете Диспетчера, который ответственен за вызов Операций и продвижение данных между ними.

Я пытаюсь сделать что-то подобное в языке Common LISP, и я хочу использовать ту же базовую структуру, т.е. каждая операция определяется как нормальная функция, которая вводит список и производит список, но лениво.

Я могу define-condition условие (have-value) использовать для yield- как поведение, и я могу выполнить его в единственном цикле, и это работает отлично. Я определяю операции тот же путь, цикличное выполнение через исходные данные:

(defun count-records (rows)
   (loop for count from 0
         for row in rows
         do (signal 'have-value :value `(:count ,count @,row))))

Проблема состоит в том, если я хочу представить в виде строки вместе несколько операций и выполнить их. Моя первая попытка записи диспетчера для этих взглядов что-то как:

(let ((next-op ...))  ;; pick an op from the set of all ops
  (loop
    (handler-bind
        ((have-value (...)))  ;; records output from operation
    (setq next-op ...)  ;; pick a new next-op
    (call next-op)))

Но перезапуски имеют только динамическую степень: каждая операция будет иметь те же имена перезапуска. Перезапуск не является объектом Lisp, который я могу хранить, для хранения состояния функции: это - что-то Вы вызов по имени (символ) в блоке обработчика, не продолжение, которое можно сохранить для более позднего использования.

Действительно ли возможно сделать что-то как, я хочу здесь? Или действительно ли я более обеспечен просто то, чтобы заставлять каждую операционную функцию явно посмотреть на ее входную очередь и явно поместить значения в очередь вывода?

5
задан Rainer Joswig 1 June 2010 в 19:39
поделиться

2 ответа

Я не думаю, что система условий - это то, что нужно здесь использовать. С продолжениями будет лучше. Кроме того, компилятор C# превращает представленный вами метод в объект, подобный продолжению.

В Common Lisp вы можете создавать продолжения с помощью библиотеки cl-cont.

0
ответ дан 15 December 2019 в 06:17
поделиться

Обычный Common Lisp не поддерживает сопрограммы или нисходящие продолжения. Вы не можете выпрыгнуть из некоторых вычислений, а затем вернуться обратно. Существуют библиотеки (например, cl-cont ) для обеспечения «некоторой» поддержки продолжений.

Я бы использовал «потоковые» (см. SICP ) абстракции (с использованием FORCE и DELAY) или что-то вроде SERIES (которое реализует эффективное средство ленивых вычислений).

3
ответ дан 15 December 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: