我会事先承认以下是对我想要做的非常可怕的描述.提前道歉.请提问我帮忙解释一下.:-)
我用其他语言编写了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