原则上这种编程风格是可行的,但作为一个Lisp-2,必须添加多个#和funcalls。此外,与Haskell相反,例如,CL中没有函数,并且没有隐式的部分应用程序。一般来说,我认为这样的风格不会很习惯CL。
例如,您可以定义部分应用程序和组合,如下所示:
(defun partial (function &rest args)
(lambda (&rest args2) (apply function (append args args2))))
(defun comp (&rest functions)
(flet ((step (f g) (lambda (x) (funcall f (funcall g x)))))
(reduce #'step functions :initial-value #'identity)))
(这些只是我匆匆忙忙的例子 – 他们没有真正的测试,或者是针对不同的用例进行了深思熟虑。)
那些,像Haskell中的map((* 2)。(1))xs的东西变成:
CL-USER> (mapcar (comp (partial #'* 2) #'1+) '(1 2 3))
(4 6 8)
总结示例:
CL-USER> (defparameter *sum* (partial #'reduce #'+))
*SUM*
CL-USER> (funcall *sum* '(1 2 3))
6
(在这个例子中,你也可以设置一个符号的函数单元,而不是将该函数存储在值单元格中,以便绕过函数调用)。
在Emacs Lisp中,部分应用程序内置在应用程序中。
在Qi / Shen中,函数是curried,隐式部分应用程序(当使用一个参数调用函数时):
(41-) (define comp F G -> (/. X (F (G X))))
comp
(42-) ((comp (* 2) (+ 1)) 1)
4
(43-) (map (comp (* 2) (+ 1)) [1 2 3])
[4 6 8]
在Clojure中还有一种类似于“流水线”的感觉的句法穿线糖:
user=> (-> 0 inc (* 2))
2