gpt4 book ai didi

lisp - Lisp 中的默认编程

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:57 24 4
gpt4 key购买 nike

是否可以使用/实现 tacit programming (也称为无点编程)在 Lisp 中?如果答案是肯定的,是否已完成?

最佳答案

原则上,这种编程风格在 CL 中是可行的,但是,作为 Lisp-2,必须添加几个 #'funcall。此外,与例如 Haskell 相比,函数在 CL 中没有柯里化(Currying),也没有隐式的偏应用。总的来说,我认为这样的风格不会很惯用 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)

sum 示例:

CL-USER> (defparameter *sum* (partial #'reduce #'+))
*SUM*
CL-USER> (funcall *sum* '(1 2 3))
6

(在此示例中,您还可以设置符号的函数单元而不是将函数存储在值单元中,以便绕过函数调用。)

顺便说一句,在 Emacs Lisp 中,部分应用程序作为 apply-partially 内置。

在Qi/Shen中,函数是柯里化(Currying)的,并且支持隐式偏应用(当函数被一个参数调用时):

(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

关于lisp - Lisp 中的默认编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073250/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com