- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
泛型似乎提供了一个很好的工具,可以提取一个常见的单词,并使其根据您通过的类型在事物上起作用,并且事后具有扩展性。
但是,那些已经被使用但没有被定义为通用词的普通单词呢?例如,如果我尝试定义“删除”:
(defclass reticulator () (splines))
(defmethod remove ((item reticulator)
sequence &key from-end test test-not start end count key))
COMMON-LISP:REMOVE already names an ordinary function or a macro.
(defgeneric remove (item sequence &key from-end test test-not start end count key))
WARNING: redefining COMMON-LISP:REMOVE in DEFGENERIC
最佳答案
事情为什么如此?
Common Lisp的第一个版本是从1981/82年开始设计的,其结果在1984年出版了《 Common Lisp the Language》一书。该语言本身主要是基于Lisp Machine Lisp(又名Zetalisp)设计的。 Zetalisp比当时发布的Common Lisp大得多,并且包含一个称为Flavors的早期对象系统。 Zetalisp中的许多内容都是以面向对象的方式实现的-确实提高了性能,而在Lisp Machines上,性能的影响并不那么大-但是他们拥有专门的处理器,这些处理器对指令集进行了优化。因此,Common Lisp不包含任何对象系统,因此针对当时典型处理器的性能进行了稍微优化。在更高版本的Common Lisp中,将添加一个对象系统-当有足够的关于Lisp的面向对象扩展的经验时-请记住,我们谈论的是80年代初期。
1984年的Common Lisp具有有限形式的通用行为。例如,REMOVE
函数可用于序列-序列是一种新类型,具有向量和列表作为子类型。
后来,Common Lisp于1986年开始标准化,其中一个正在寻找Common Lisp的对象系统-所提出的建议都不够好-因此,在New Flavors的基础上开发了一个新的系统(来自Symbolics,是上述版本的较新版本) flavor )和通用循环(来自Xerox PARC)。那些已经具有通用功能,但是只有一次调度。然后,CLOS添加了多个调度。
决定不使用CLOS泛型函数替换基本功能-原因之一是性能:CLOS泛型函数需要相对复杂的分派(dispatch)机制,并且此分派(dispatch)是在运行时确定的。没有CLOS功能具有静态编译时分派(dispatch)功能,也没有标准化功能可将类的各个部分“封闭”->从而使它们无法更改。因此,像CLOS这样的高动态系统具有运行时成本。
一些函数被定义为CLOS通用函数(例如PRINT-OBJECT
),而一些实现则具有Common Lisp和CLOS实现的大部分(流,条件等)-但这是实现特定的,不是标准要求的。还有几个库,它们提供内置CL功能的基于CLOS的功能:例如具有可扩展的基于CLOS的流的I/O。
另请注意,重新定义现有的Common Lisp函数是未定义的行为。
因此,Common Lisp选择提供一个功能强大的对象系统,但将其留给各个实现使用基本语言的CLOS的具体数量–局限性在于通常不应将标准化为普通非CLOS泛型函数的功能由用户替换为CLOS功能。
一些Lisp方言/实现试图处理这些问题,并试图定义一个更快的CLOS变体,然后这将成为许多语言的基础。例如,参见Apple的Dylan语言。有关一些较新的方法,请参见语言Julia。
您自己改进的Common Lisp
包(->符号 namespace )允许您定义自己的改进的CL:在这里,我们定义了一个新的包,其中包含所有CL符号,只有cl:remove
被其自己的符号遮盖。然后,我们定义一个名为bettercl::remove
的CLOS泛型函数,并编写两个示例方法。
CL-USER 165 > (defpackage "BETTERCL" (:use "CL") (:shadow cl:remove))
#<The BETTERCL package, 1/16 internal, 0/16 external>
CL-USER 166 > (in-package "BETTERCL")
#<The BETTERCL package, 1/16 internal, 0/16 external>
BETTERCL 167 > (defgeneric remove (item whatever))
#<STANDARD-GENERIC-FUNCTION REMOVE 4060000C64>
BETTERCL 168 > (defmethod remove (item (v vector)) (cl:remove item v))
#<STANDARD-METHOD REMOVE NIL (T VECTOR) 40200AB12B>
BETTERCL 169 > (remove 'a #(1 2 3 a b c))
#(1 2 3 B C)
BETTERCL 170 > (defmethod remove ((digit integer) (n integer))
"remove a digit from an integer, returns a new integer"
(let ((s (map 'string
(lambda (item)
(character (princ-to-string item)))
(cl:remove digit
(map 'vector
#'digit-char-p
(princ-to-string n))))))
(if (= (length s) 0) 0 (read-from-string s))))
#<STANDARD-METHOD REMOVE NIL (INTEGER INTEGER) 40200013C3>
BETTERCL 171 > (remove 8 111888111348111)
11111134111
BETTERCL
导出符号,以便可以在应用程序包中使用此包,而不是
CL
包。
; do some astrophysics calculations
(defmethod rotate-around ((s star) (u galaxy)) ...)
; do some computation with graphics objects
(defmethod rotate-around (shape (a axis)) ...)
:before
,
:around
和
:after
方法可能不会产生有用的结果。
rotate-around
泛型函数,一个在
ASTRO-PHYSICS
包中,另一个在
GRAPHICS-OBJECTS
包中。因此,这些方法将不在同一CLOS通用函数中,并且扩展这些方法可能会更容易。
关于lisp - 如何将 “taken”单词用作CLOS泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53574843/
你们能帮帮我吗,这是我们的讲师给我们的教程问题,无论我们尝试了多少,我们实际上似乎都无法破解它。请帮忙 ; perform some type/error checking, ; then ca
在 Common Lisp 中编写、编译和测试一个函数,该函数接受一个列表并计算列表中正整数的总数。必须编译然后执行包含函数的 .lisp 文件。在编译该文件后开始传递它,列出要生成的结果的结果,从而
我是 Lisp 初学者,我很难理解为什么下面的代码会给我一个错误。 (dolist (elem '(mapcar mapcon)) (when (fboundp `
我听说 Lisp 可以让你重新定义语言本身,我也试图研究它,但没有任何地方明确的解释。有人有一个简单的例子吗? 最佳答案 Lisp 用户将 Lisp 称为 可编程编程语言 .用于符号计算 - 用符号计
Closed. This question is off-topic. It is not currently accepting answers. Learn more。 想改进这个问题吗Updat
这些是 cons 参数的不同组合的输出。我刚开始学习 lisp。有人可以帮我理解这些吗? Break 80 [81]> (CONS '(A) 'B) ((A) . B) Break 80 [81]>
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想问一下为什么这个功能不起作用... (defun nenum(ls) (cond ((null ls) nil) ((listp car(ls)) (nenum (rest ls)
如果我有一个原子,例如“a4”,我需要能够将 1 添加到“4”部分以使其成为 a5,但是因为它被认为是一个字符串,所以这是不可能的,所以如果我可以拆分 (a4 ) 到 ((a)(4)) 中,然后我可以
我有一个关于动态构建函数(或类似的东西)的问题。在 Java 中,我可以通过编程将一些 Source 写入字符串,编译该字符串并像函数一样执行它多次。 假设我有一些遗传算法来创建最佳代码以获取 n 个
我是 Common Lisp 的新手,正在学习教程,但无法全神贯注 (equal '(reverse (a b)) '(b a))) 返回零。 非常感谢您的协助。 M. 最佳答案 在 lisp 中引
我有一个使用列表表示的树。例如: (1 ((2 (3)) (3 (2)))) (2 ((1 (3)) (3 (1)))) (3 ((1 (2)) (2 (1)))))` 现在我需要在维护层次结构树的同
在此站点:http://www.gigamonkeys.com/book/practical-a-simple-database.html有如下列出的用户入口函数: (defun prompt-rea
我对 lisp 比较陌生,对在以下上下文中使用嵌套列表的最佳方法很好奇: 所以,我有以下功能: (defun get-p0 (points) (loop for (label x y) in
我正在为 CLOS 类编写一个函数,该函数反转所述类对象的列表元素。 我有一个返回反向列表的方法,但如何让它将对象的列表设置为该列表?我可以在存储列表的函数中有一个实例变量,然后将元素设置为那个吗?或
我知道,严格来说,没有编译语言或解释语言这回事。 但是,一般来说,LISP 是用来编写 Python、bash 脚本、批处理脚本之类的脚本的吗? 还是像 C++、JAVA 和 C# 这样的通用编程语言
在此站点 http://jatha.sourceforge.net/快速函数的示例是通过递归。是不是递归通常比 Lisp 中的迭代更快并且性能更好? 编辑:Lisp 是否比其他语言更优化递归? 最佳答
另一个新手(常见)LISP 问题: 基本上在大多数编程语言中,函数都有一种方法接收对变量的引用而不仅仅是值,即通过引用传递而不是通过值传递。比方说,为了简单起见,我想编写一个 LISP 函数来接收一个
这个问题在这里已经有了答案: How do I find the index of an element in a list in Racket? (3 个答案) 关闭 9 年前。 如果我有这样的列
我在为这个程序生成正确的输出时遇到了一些问题。我的输出几乎是正确的,但缺少一些步骤。我的代码如下: (defun kt (x y m n) ;set the
我是一名优秀的程序员,十分优秀!