小编Ken*_*Ken的帖子

用于控制转移的Common Lisp条件系统

我会事先承认以下是对我想要做的非常可怕的描述.提前道歉.请提问我帮忙解释一下.:-)

我用其他语言编写了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将多个这些操作串在一起,并调用Dispatcher,它负责调用Operations并在它们之间推送数据.

我试图在Common Lisp中做类似的事情,我想使用相同的基本结构,即每个操作被定义为输入列表并输出列表的普通函数,但是懒得.

我可以define-condition使用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))))
Run Code Online (Sandbox Code Playgroud)

问题是如果我想将几个操作串在一起,并运行它们.我为这些编写调度程序的第一次尝试看起来像是:

(let ((next-op ...))  ;; pick an op from the set of all ops
  (loop
    (handler-bind
        ((have-value (...)))  ;; records output from …
Run Code Online (Sandbox Code Playgroud)

etl common-lisp lazy-evaluation control-flow conditional-statements

5
推荐指数
0
解决办法
553
查看次数