在 Common Lisp 中,如何定义通用数据类型说明符(如整数列表)?

2023-11-21

我想定义一个类型说明符来描述相同类型的事物列表。所以我想有(list-of integer)如同(array integer)(这是内置的)。我可以为特定类型创建它,如下所示:

(defun elements-are-integer (seq) 
  (every #'(lambda (x) (typep x 'integer)) seq))
(deftype list-of-integer ()
  '(and list (satisfies elements-are-integer)))

但是,这意味着我必须对每种可能的类型执行此操作。我如何更改此代码,以便该类型采用另一种类型作为参数,并构造satisfies动态谓词?问题是satisfies需要一个全局符号,而且我不知道如何在正确的上下文中定义谓词函数(我想我需要gensym不知何故,但如何?)。此外,该解决方案应该有效,以便可以在另一个包内创建该类型。


尝试这个:

(defun elements-are-of-type (seq type)
  (every #'(lambda (x) (typep x type)) seq))

(deftype list-of-type (type)
  (let ((predicate (gensym)))
    (setf (symbol-function predicate)
      #'(lambda (seq) (elements-are-of-type seq type)) )
    `(and list (satisfies ,predicate)) ))

(typep '(1 2 3) '(list-of-type integer))
; -> T

(typep '(1 2 a) '(list-of-type integer))
; -> NIL

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

在 Common Lisp 中,如何定义通用数据类型说明符(如整数列表)? 的相关文章

  • 如何在创建实例期间强制检查插槽的类型?

    假设我有以下类声明 defclass foo class bar initarg bar type list 当我创建这个类的实例时 make instance不会检查传递的参数是否满足槽类型 所以 我可以这样创建 无效 对象 gt mak
  • Common Lisp 整数到十六进制的转换

    是否有一个与 parse integer ff radix 16 类似的函数可以让我以另一种方式返回 如果我有 int 255 如何将其转换为字符串 ff write to string 255 base 16
  • Common Lisp 中有停止解释器的命令吗?

    我正在寻找一个表达式 它会导致解释器在求值时退出 我发现了很多特定于实现的内容 但在 HyperSpec 中没有找到 我想知道是否有一些我在规范中没有看到的定义 我发现 quit 被 CLISP 和 SLIME 认可 并且 exit 仅被
  • 更改列表的第 n 个元素

    我想更改列表的第 n 个元素并返回一个新列表 我想到了三个相当不优雅的解决方案 defun set nth1 list n value let list2 copy seq list setf elt list2 n value list2
  • 如何使用 common lisp 确定操作系统和主机名?

    为了让我的 sbclrc 文件在我使用的两台计算机上工作 我想要一种从 sbcl 中获取主机名和 或操作系统的方法 我知道我可以设置然后查找环境变量 但是有更直接的方法吗 Update 我将问题更改为引用 common lisp 因为 Ke
  • 如何使用 SBCL 正确保存 Common Lisp 图像?

    如果我想创建我的程序的 Lisp 映像 我该如何正确地做到这一点 有什么先决条件吗 它与 QUICKLISP 配合得很好吗 现在 如果我启动 SBCL 仅预加载 QUICKLISP 并保存图像 save lisp and die core
  • Common Lisp 重新启动到条件绑定

    我在空闲时间学习 Common Lisp 并对条件系统有疑问 当我们在 common lisp 中处理错误时 我们在处理程序中指定错误类型来确定要处理哪个错误 在引发和处理错误之间 我可以进行一些重新启动 例如使用 restart case
  • Jupyter 和 Common Lisp

    我正在尝试安装cl jupyter https github com fredokun cl jupyter common lisp 内核Jupyter http jupyter org 我无法让它工作 当我打开一个新的 lisp 笔记本
  • Common Lisp 中的未绑定变量

    我是 Lisp 新手 正在阅读 ANSI Common Lisp 第 8 章中的文本生成器示例 我按照该示例并在 LET 变量 prec 的范围内定义了一个函数 see let prec defun see symb let pair as
  • CLISP - 反转简单列表

    我必须反转简单 单维 列表的元素 我知道有一个内置的反向函数 但我不能用它来做这个 这是我的尝试 defun LISTREVERSE LISTR cond lt length LISTR 2 LISTR listr is 1 atom or
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 在Emacs中,这个错误是什么意思? “警告:运行时需要 cl 包”

    我正在字节编译一个模块 它给了我这个警告 Warning cl package required at runtime 为什么这是一个警告 我很清楚我正在使用cl包裹 事实上有一个 require cl 模块中的语句 使用有什么问题吗cl
  • Lisp 格式和强制输出

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

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 在 Common Lisp 中编写 Lambda 表达式

    我目前正在阅读 Paul Graham 的 ANSI Common Lisp 并且有一个关于编写 lambda 表达式的问题 我们是否需要在 lambda 表达式前面加上前缀 如果我在 REPL 中写这样的东西 它会工作得很好 gt lam
  • 评估 Common Lisp 宏的参数

    我想制作一个宏 其行为取决于它的参数之一 例如 defclass myvar l initarg l reader l defparameter mv1 make instance myvar l 10 defmacro mac1 v pr
  • 从 CCL 检索(加载)源代码?

    我打了电话 load code lisp 用CCL 然后不小心删除了code lisp 有什么办法可以找回源代码吗 CCL 在内存中是否有它 这是一个非常特殊的功能 这里只为克洛祖尔CL 该代码在其他地方不起作用 这在 CCL IDE 中对
  • 递归分割列表函数 LISP

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

    为什么我们必须使用funcall在 Common Lisp 中调用高阶函数 例如 为什么我们必须使用 defun foo test func args funcall test func args 而不是更简单的 defun bar tes
  • 如何定义所有成员均为给定类型的列表

    我对 CL 类型系统有点陌生 但我认为像下面这样的东西可以工作 deftype list of type labels check all l every lambda item typep item type l and list sat

随机推荐

  • 在Python中检测Windows 8.1?

    我们有一个使用的脚本平台模块检测我们各种客户端的操作系统版本 查看platform py的源代码 我可以看到在Windows系统上 它使用sys getwindowsverion 不幸的是 在 Windows 8 1 系统上 该特定函数报告
  • Eclipse 中的 Python 文档

    有没有办法将标准Python文档集成到Eclipse中 因此 可以在 API 函数上按 F1 并在 Eclipse 的帮助视图中获取其描述 我使用 PyDev Thanks 我也遇到了同样的问题 所以我为此目的制作了一个 Eclipse 插
  • 如何保存并检查文件是否存在于作用域存储中?

    到目前为止 我检查文件是否存在 如果不存在 则将其保存到 Environment getExternalStoragePublicDirectory Environment DIRECTORY PICTURES 中的设备 但 Android
  • 在没有 DataBind 的情况下向 GridView 添加新行

    我有一个 GridView 它允许随时编辑每一列 每一行中的值 用户输入所有更改 单击 保存 一次 所有更改均已提交 用户还必须能够单击 新建 按钮 在 GridView 中显示一个新行 是的 它必须显示在实际的 GridView 中 输入
  • 当 C++ 标准提供将名称引入全局命名空间的 C 标头时,这是否包括重载?

    即将推出的 C 0x 标准的最终委员会草案表示 每个 C 标头 每个标头都有一个 name h 形式的名称 其行为就像 标准中的每个名称 库名称空间由相应的 cname 标头位于 全局命名空间范围 这是 未指定这些名称是否是 首先声明或定义
  • MYSQL根据列数据和表名连接表

    我想知道这是否可能 我想根据表1的数据连接2个表 示例表 1 具有列 food 其数据为 hotdog 我有一张桌子叫热狗 是否可以进行 JOIN 之类的操作 SELECT FROM table1 t join t food on id f
  • DDD:聚合根

    我需要帮助来找到我的聚合根和边界 我有 3 个实体 计划 计划角色和计划培训 每个计划可以包含许多 PlannedRoles 和 PlannedTrainings 解决方案 1 起初我认为 Plan 是聚合根 因为脱离 Plan 的上下文
  • vim 中使用 powershell 的 system()

    我正在尝试在 Vim 中编写一个简单的函数来返回 powershell 命令的结果 不过 我的结果总是乱七八糟 我认为这可能是一个编码问题 但正如您所看到的 这个问题很奇怪 因为它 有点有效 但我没有任何解决问题的办法 在 vim 中设置以
  • 警报对话框或自定义警报对话框的大小

    我正在为 10 1 的所有平板电脑创建应用程序 现在我正在三星 Galaxy 选项卡上尝试此操作 我已经完成了所有部分 但关于平板电脑尺寸的警报对话框太小 我还创建了自定义警报对话框 但看起来不太好 那么告诉我我可以更改默认警报对话框的大小
  • 当 AutoGenerateColumns 设置为 True 时,如何停止在 DataGrid 中生成特定列?

    我已将 ObservableCollection 绑定到DataGrid并设置AutoGenerateColumns在具有 MVVM 应用程序的 WPF 中为 true 那我该怎么办stop a specific column要出现在 Da
  • 如何在 C# 中每隔几秒调用一个特定方法?

    机器人游戏 是我开发的第一个基础游戏 洋红色 角色是敌人 它应该在这张地图中随机移动 但它的随机移动太快 我尝试使用线程 但它会影响所有角色的速度 现在 我需要每 100 毫秒调用一次 Enemy 方法 Robot game Image 您
  • 如果我在存储过程中有多个 select 语句,如何使用 SqlDataReader

    我在 Microsoft SQL Server 2005 的存储过程中编写了三个 select 语句 两个 select 语句都返回多个记录 并且 select 语句的表列表不同 一个从主表中选择记录 另一个从子表中选择记录 在 C 代码中
  • 我该如何写上标文字?

    我有一个应用程序 其中包含大量上标数字或字母 我注意到 X span 3 span and just using sup tag around the figure 3 both yield X3 in my app But only th
  • 更改 ListView 背景 - 奇怪的行为

    我在更改 ListView 中视图的背景时遇到问题 我需要的 onClick 更改一行的背景图片 实际发生的情况 按下例如后 背景会发生变化 选择 第一个条目 但向下滚动后 第 8 个条目也被选中 滚动回到顶部 第一个不再被选择 现在选择第
  • 如何为ASP.NET身份设置密码规则?

    在我的 ASP NET 应用程序中 我在 web config 的 DefaultMembershipProvider 和 SqlMembershipProvider 中有以下设置 enablePasswordRetrieval true
  • 有符号整数溢出在 C++ 中仍然是未定义的行为吗?

    据我们所知 有符号整数溢出是未定义的行为 但C 11中有一些有趣的东西cstdint文档 有符号整数类型 宽度分别为 8 16 32 和 64 位 没有填充位 使用 2 的补码表示负值 仅当实现直接支持该类型时提供 See link 这是我
  • Java(JAXP)DocumentBuilder的XML解析差异

    之间有什么区别吗 DocumentBuilder parse InputStream and DocumentBuilder parse InputSource 我只能发现 对于第一种情况 解析器从流中检测编码 因此它更安全 而在后者中我不
  • 如何在后台使用 Flutter Method Channel(应用程序最小化/关闭)

    我正在 Flutter 应用程序中开发原生 Android 小部件 其中有刷新按钮 单击该按钮时我必须调用 Flutter 代码中的方法 我使用 Flutter Method Channel 进行通信 当应用程序位于前台时它工作正常 但当应
  • 无需 gcloud 客户端即可访问 google 容器注册表

    我有一个 CoreOS docker 主机 我想在其上开始运行容器 但是当尝试使用 docker 命令从 google 容器私有注册表中获取映像时 https cloud google com tools container registr
  • 在 Common Lisp 中,如何定义通用数据类型说明符(如整数列表)?

    我想定义一个类型说明符来描述相同类型的事物列表 所以我想有 list of integer 如同 array integer 这是内置的 我可以为特定类型创建它 如下所示 defun elements are integer seq eve