从泛型函数中删除一种方法

2023-11-27

我已将以下方法添加到通用函数中speak但现在想删除 REPL 中的这个特定方法,而不删除其余的通用函数的方法。

(defmethod speak :around ((c courtier) string)           ; [1]
  (format t "Does the King believe that ~A?" string)
  (if (eql (read) 'yes)
      (if (next-method-p) (call-next-method))            ; [2]
      (format t "Indeed, it is a preposterous idea.~%"))
  'bow)

[1] The :around method replaces the primary method for the type.
[2] Then it decides whether to call the primary method or not.

The 文档链接到函数remove-method没有示例,我不知道引用实际的语法是什么:around方法同上。

(remove-method #'speak)
TOO FEW ARGUMENTS

(remove-method #'speak :around)
NO-APPLICABLE-METHOD


从文档中:

删除方法泛型函数方法

它需要一个通用函数对象和一个方法对象作为参数。

人们可以通过以下方式找到该方法find-method.

CL-USER 39 > (find-method #'speak
                          (list :around)
                          (list (find-class 'courtier) (find-class t)))
#<STANDARD-METHOD SPEAK (:AROUND) (COURTIER T) 42001285EB>

CL-USER 40 > (remove-method #'speak
                            (find-method #'speak
                                         (list :around)
                                         (list (find-class 'courtier)
                                         (find-class t))))
#<STANDARD-GENERIC-FUNCTION SPEAK 422000A68C>

另请注意,良好的 Lisp 开发环境还可能允许删除编辑器或检查器中的方法。

请注意,在 Lisp 监听器中,不需要调用find-method像上面一样两次。变量*包含最后的结果。

CL-USER 43 > (find-method #'speak
                          (list :around)
                          (list (find-class 'courtier)
                                (find-class t)))
#<STANDARD-METHOD SPEAK (:AROUND) (COURTIER T) 4200150DEB>

CL-USER 44 > (remove-method #'speak *)
#<STANDARD-GENERIC-FUNCTION SPEAK 422000A68C>

这是在 GNU Emacs 中使用 SLIME 的另一个交互示例推介会SLIME 功能已启用。 A推介会是 Lisp 输出,它保持打印对象和生成文本之间的联系。

Slime REPL

致电find-method功能。它返回方法。这里我们使用presentations,它保持文本和 Lisp 对象之间的联系。输出以红色显示,它是鼠标敏感。将鼠标移动到红色返回的对象上将添加交互选项。

现在输入(remove-method #'speak然后在红色输出上单击鼠标中键(或 SLIME 配置为使用的任何内容):演示文稿(文本和连接的对象)将被复制到该行。类型)并输入表格。那么,SLIME 实际上已经用真实的对象而不是文本表示构建了一个列表。

这就是 repl 在 Symbolics Lisp Machine 和 CLIM / McCLIM 中的工作方式......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从泛型函数中删除一种方法 的相关文章

  • Common Lisp 中有停止解释器的命令吗?

    我正在寻找一个表达式 它会导致解释器在求值时退出 我发现了很多特定于实现的内容 但在 HyperSpec 中没有找到 我想知道是否有一些我在规范中没有看到的定义 我发现 quit 被 CLISP 和 SLIME 认可 并且 exit 仅被
  • common lisp:宏如何使用以编程方式生成的名称定义其他方法/宏?

    我意识到我的代码的某个部分由看起来相似的方法组组成 就像我有多个三重奏 一个由程序员的其他两个函数调用的辅助函数 我正在尝试编写一个宏来为我定义这三个函数 以便我所需要做的就是调用该宏 但我的尝试导致 defun 和函数调用将引用字符串而不
  • Common Lisp 案例和引用元素

    我正在用 CL 编写一个地下城爬行游戏 但在处理案例表单时遇到了问题 两件事情 Common Lisp 抱怨Duplicate keyform QUOTE in CASE statement make instance cl rogue t
  • 如何在 SLIME 的 REPL 中获得 Common Lisp 的语法高亮显示?

    我想学习 Common Lisp 并通过 emacs 包管理器安装了 emacs 24 3 和 slime 在 slime REPL 语法高亮中不起作用 另一方面 当我启动 Lisp Mode 在 slime REPL 中 时 表达式的值不
  • Common Lisp 中的属性列表是否引用某些全局状态?

    下面的代码有z作为局部变量 但它的行为就像全局变量一样 defun foo m let z stuff nil push m getf z stuff print z foo 1 foo 2 foo 3 我希望输出是 STUFF 1 STU
  • Lisp 内部引用工作

    口齿不清是如何做到的quote内部工作 例如 quote 1 1 2 似乎相当于 list 1 list 1 2 这意味着它是如何递归地象征 Head 值的 这个功能是内置的吗 Run equal quote 1 1 2 list 1 li
  • Common Lisp 鼠标位置与 ltk

    我正在 Common Lisp 中制作一个简单的小程序 我想使用鼠标移动来控制它 我用 LTK 作为窗口 我找不到任何可以检索鼠标位置的函数 例如 Emacs Lisp 有 鼠标像素位置 我发现这在罗塞塔代码上 https rosettac
  • Lisp 格式和强制输出

    我不明白为什么这段代码在不同的实现中表现不同 format t asdf setq var read 在 CLISP 中 它的行为与预期一致 先打印提示 然后读取 但在 SBCL 中 它显示 then输出 我在网上查了一下 修改了一下 fo
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • Common Lisp——为什么这个符号不是外部的?

    我正在尝试在 ASDF 中运行测试 如下所示 foo asd defsystem foo tests depends on foo fiveam components module tests components file main pe
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • 使用局部特殊变量

    为了方便原型设计 我依赖于许多全局变量 这些变量在整个代码中大量使用 但现在我想让其中一些成为本地的 但动态的 在本地声明它们是否有任何重大缺点 例如 效率等 special而不是全球 特殊变量不受欢迎的功能包括 缺乏参考透明度 这使得对代
  • 递归分割列表函数 LISP

    split list 函数接受一个列表并返回一个由两个列表组成的列表 其中两个列表由输入的交替元素组成 我写了以下内容 defun split list L cond endp L list NIL NIL t let X split li
  • setf中的f代表什么?

    LISP 有setf函数给变量赋值 现在我一直想知道该函数的名称 Theset部分是显而易见的 但是什么是f后缀代表 F的实际含义经常被忘记 根据一些消息来源 f 后缀可以代表 字段 例如参见这个answer https stackover
  • 关于onlisp中的广义变量

    我不确定这里发生了什么 文中的宏观示例 基本上不知道如何使用get setf 方法 一个内置宏 也许是函数 具体来说 如果某些返回值是这样的情况呢 get setf 方法为零 例如 get setf 方法 x NIL NIL NEW 306
  • 如何在 Lisp 中生成一系列佩尔数而不是特定的数

    如何使用 cons 或其他方式打印列表佩尔数 https en wikipedia org wiki Pell number直到第N个数 defun pellse k if or zerop k k 1 k 2 pellse k 1 pel
  • 我如何访问 Common lisp 中 Defclass 插槽的 :Documentation 字符串

    好的 这是我如何实例化 Defclass 以及相关的 Defmethod 和 Defparameter defvar account numbers 0 defclass bank account customer name initarg
  • 如何指定 sbcl(或 common lisp)向量中的元素类型?

    我尝试在 sbcl 1 1 14 中执行以下代码 但类型检查似乎忽略了向量元素的声明 defun test vec declare type vector integer vec format nil a elt vec 0 有什么提示吗
  • Common Lisp:循环列表中连续对的最佳方法是什么?

    有时我需要循环遍历列表中的连续对 我现在的做法是 loop for x on lst while not null cdr x do something on car x and cadr x 我想知道是否有更好的 内置的方法来做到这一点
  • 带有剩余参数的函数调用带有剩余参数的函数

    假设我们有一个函数func1 defun func1 rest values do something with values loop for i in values collect i 现在 我们有一个函数func2哪个调用func1

随机推荐

  • 如何按空格分割字符串但在引号内转义空格(在java中)? [复制]

    这个问题在这里已经有答案了 我有一个像这样的字符串 Video or movie parent Media or entertainment 1 1 1 0 0 我想用空格分割它 但引号内的空格应该被忽略 所以分割后的字符串应该是 Vide
  • 使用 CLLocation 计算两个坐标之间的距离

    我在用着CLLocationDistance获取两点之间的距离 但在传递当前位置时出现错误 CLLocation current CLLocation alloc initWithLatitude startLocation coordin
  • uniswap 程序集 create2 功能如何工作?

    我正在查看 uniswap 代码 试图理解代码 其中大部分内容都非常清楚 但我确实有一些问题 在这个函数中 function createPair address tokenA address tokenB external returns
  • 在值构造函数中指定类约束

    有没有办法为值构造函数的参数定义类约束 像这样的东西 data Point2D Num a gt Point a a 那么 Point 可以接受任何参数 只要它们属于 Num 类 您可以使用ExistentialQuantification
  • 删除列表中元组的第一个元素

    我有一个元组列表 如下所示 values 1 hi you 2 bye bye 然而 每个元组的第一个元素不是必需的 期望的输出是 hi you bye bye 我已经做了足够的研究 知道我无法操作元组 但我似乎无法找到如何成功删除列表中每
  • 我如何“取消设置”已声明的类

    我有一个完整的表单创建系统 有许多不同的问题类型 我必须检查该人所做的答案是否正确 所有类型的问题都有自己的类 始终称为 ItemClass 并且该类位于其自己的文件中 每次提出问题时 我都会包含该文件 但存在问题 我必须在一个 PHP 文
  • 如何在字符串的特定位置添加字符?

    我正在使用 Notepad 想要使用正则表达式替换在字符串中的特定位置插入字符 比如说 在每行的位置 6 处插入一个逗号 表达式会是什么 如果您想在第六个字符之后添加一个字符 只需使用搜索 6 和替换 1 示例插入一个 从技术上讲 这会将每
  • Java 调试器无法调用某些默认方法实现

    我正在 IntelliJ IDEA 中编码 调试我的应用程序时 我无法使用某些默认方法实现Watches 这是一个浓缩示例 public class Friendship interface Friend default void sayH
  • 如何在 iOS 7 上让 NSTimer 在后台保持活动状态?

    我创建了在后台运行 NSTimer 的应用程序 我使用位置管理器在后台运行 NSTimer 我使用下面的链接在后台运行 NSTimer 如何在 iOS 应用程序中每 n 分钟更新一次后台位置 这种方法在 iOS 6 中工作正常 但在 iOS
  • Activity崩溃生命周期方法-android

    我正在开发一个应用程序 在崩溃的情况下 需要保存崩溃时的一些数据 现在 我将数据保存在 onDestroy 中 如下所示 Override protected void onDestroy saveState super onDestroy
  • Windows Phone 7 中的推送通知问题

    我尝试了以下教程来在 Windows Phone 7 中创建推送通知 http www sgtconker com 2010 03 article windows phone 7 push notifications http www si
  • 如何使用 Inkscape 将 SVG 字符串转换为 jpg

    在花了两天时间尝试使用 ImageMagick 从 SVG 字符串光栅化 jpeg 后 我终于放弃了 虽然我设法使实际转换工作正常 但在渲染图像时 Imagemagick 似乎无法正确转换变换 旋转功能 导致输出与原始 SVG 不同 经过进
  • 将字符串转换为日期时间对象

    我想将此字符串转换为日期时间对象 Wed Oct 20 16 35 44 0000 2010 有没有一种简单的方法可以做到这一点 或者我是否必须编写一个 RE 来解析元素 将 Oct 转换为 10 等等 编辑 strptime 很棒 然而
  • 获取和设置屏幕分辨率

    如何使用 Visual C 收集和更改屏幕分辨率 For 检索屏幕分辨率 您将需要使用System Windows Forms Screen班级 这Screen AllScreens属性可用于访问系统上所有显示的集合 或者您可以使用Scre
  • 获取按下的按键的键值

    我不知道如何获取按下的键的值 我目前有 info price bind keydown function evt alert evt keyCode 但当我按 1 而不是返回 1 时 它返回 49 编辑 我知道键 1 的 Ascii 代码
  • 如何在 Xcode 或 iTunes connect 上获取 Testflight 外部测试器的崩溃日志?

    有什么方法可以知道某人的应用程序出了什么问题 除了这个人之外 其他人的设备都可以使用 该人尝试删除以前的版本并安装新版本 但仍然不起作用 我怀疑我放置在文档文件夹中的文件之一可能仍然存在 但此文件的格式已更改 苹果有一个关于这个名字的技术说
  • 当新的 DLL 复制到 BIN 目录时,ASP.net C# 需要重新启动 IIS

    我们遇到一个问题 每次我们将 dll 复制到 bin 目录时 我们网站上的主域就会停止运行 恢复它的唯一方法是重新启动 WWW Publishing Service 我们运行一个网站 其中包含许多在单个服务器上运行的 IIS 应用程序 其中
  • 如何在 perl 5.24 中关闭“何时是实验性的...”?

    下面的代码直接从 perldoc perl org 上的当前 perlsyn 页面复制 我已经根据需要添加了初始化和声明以使其运行 并且它按预期工作 但重点是 when 关键字 Perl 5 24 抱怨 何时 是实验性的 很公平 但我不想每
  • 在 docker 容器中启动服务失败,出现错误:无法获取 D-Bus 连接:没有与服务管理器的连接

    我安装了docker镜像并成功构建了镜像 当我 ssh 到容器并运行命令时service xxx start 弹出错误 服务 nginfra 启动 重定向到 bin systemctl start nginfra service sbin
  • 从泛型函数中删除一种方法

    我已将以下方法添加到通用函数中speak但现在想删除 REPL 中的这个特定方法 而不删除其余的通用函数的方法 defmethod speak around c courtier string 1 format t Does the Kin