Common lisp 控制权转移的通用Lisp条件系统

Common lisp 控制权转移的通用Lisp条件系统,common-lisp,etl,conditional-statements,lazy-evaluation,control-flow,Common Lisp,Etl,Conditional Statements,Lazy Evaluation,Control Flow,我承认,下面是一个非常可怕的描述我想做什么。事先道歉。请提问以帮助我解释。:-) 我已经用其他语言编写了ETL(提取、转换、加载),这些语言由单独的操作组成,看起来像: // in class CountOperation IEnumerable<Row> Execute(IEnumerable<Row> rows) { var count = 0; foreach (var row in rows) { row["record numbe

我承认,下面是一个非常可怕的描述我想做什么。事先道歉。请提问以帮助我解释。:-)

我已经用其他语言编写了ETL(提取、转换、加载),这些语言由单独的操作组成,看起来像:

// in class CountOperation
IEnumerable<Row> Execute(IEnumerable<Row> rows) {
    var count = 0;
    foreach (var row in rows) {
        row["record number"] = count++;
        yield return 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)))
问题是如果我想把几个操作串在一起,然后运行它们。我第一次尝试为这些对象编写调度器,如下所示:

// in class CountOperation
IEnumerable<Row> Execute(IEnumerable<Row> rows) {
    var count = 0;
    foreach (var row in rows) {
        row["record number"] = count++;
        yield return 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)))
但是重启只有动态范围:每个操作都有相同的重启名称。restart不是一个我可以存储的Lisp对象,用于存储函数的状态:它是在处理程序块中按名称(符号)调用的对象,而不是可以存储以供以后使用的延续


有可能在这里做我想做的事吗?还是让每个操作函数显式地查看其输入队列,并将值显式地放在输出队列上更好呢?

我认为条件系统在这里不适合使用。继续下去会更好。此外,C#编译器将您提供的方法转换为类似于延续的对象


在Common Lisp中,您可以使用cl cont库进行延续。

普通的Common Lisp不支持协程或向下延续。你不能跳出一些计算,然后再跳回。有一些库(例如)为continuations提供“一些”支持

我会使用类似“流”(参见)的抽象(使用强制和延迟)或类似的东西(实现了一个高效的惰性计算工具)