Common Lisp 类型声明未按预期工作

2024-03-28

当我在 Common Lisp 中定义一个函数时,如下所示:

(defun foo (n)
  (declare (type fixnum n))
  (+ n 42))

我期待一个像这样的电话(foo "a")立即失败,但在调用时失败+。是个declareform 不保证静态类型检查?


传统上,类型声明旨在用作编译器的保证以实现优化目的。对于类型检查,请使用check-type(但请注意,它也在运行时而不是编译时进行检查):

(defun foo (n)
  (check-type n fixnum)
  (+ n 42))

也就是说,不同的 Common Lisp 实现对类型声明的解释不同。以SBCL为例,会将它们视为要检查的类型 http://www.sbcl.org/manual/#Declarations-as-Assertions if the safety政策设定够高。

此外,如果您想要静态检查,SBCL 可能也是您最好的选择,因为它的类型推断引擎会警告您遇到的任何不一致情况。为此,ftype声明可以得到很好的利用:

CL-USER(1): (declaim (ftype (function (string) string) bar))

CL-USER(2): (defun foo (n)
              (declare (type fixnum n))
              (bar n))
; in: DEFUN FOO
;     (BAR N)
; 
; caught WARNING:
;   Derived type of N is
;     (VALUES FIXNUM &OPTIONAL),
;   conflicting with its asserted type
;     STRING.
;   See also:
;     The SBCL Manual, Node "Handling of Types"
; 
; compilation unit finished
;   caught 1 WARNING condition

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

Common Lisp 类型声明未按预期工作 的相关文章

  • LISP:关键字参数,提供-p

    目前我正在学习 Peter Seibel 的 Practical Common Lisp 在 实用 一个简单的数据库 一章中 http www gigamonkeys com book practical a simple database
  • 如何在 SLIME 的 REPL 中获得 Common Lisp 的语法高亮显示?

    我想学习 Common Lisp 并通过 emacs 包管理器安装了 emacs 24 3 和 slime 在 slime REPL 语法高亮中不起作用 另一方面 当我启动 Lisp Mode 在 slime REPL 中 时 表达式的值不
  • 在 OSX 上编译 clisp-2.49:未找到 LIBFFI

    TL DR Even if libffi似乎已安装 configure即使我给它添加 正确的 前缀 脚本也找不到它 这篇文章的最后一部分 是我陷入困境的地方 我仅提供其他信息来解释我如何到达那里 我对这篇长篇文章表示歉意 如果有些内容与您无
  • 在lisp中,如何使用floor函数返回的第二个值?

    当我这样做时 4楼3 我得到了 1 1 3 但我该如何使用这 1 3 呢 例如 您可以使用将其绑定到变量multiple value bind multiple value bind quot rem floor 4 3 format t
  • 如何使用 Common Lisp 获得列表的所有可能排列?

    我正在尝试编写一个 Common Lisp 函数 该函数将给出列表的所有可能排列 每个元素仅使用一次 例如 列表 1 2 3 将给出输出 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我已经写过一些有用的东西 但它
  • 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
  • 了解 LISP 中的绑定变量和自由变量

    我正在阅读SICP 又出现了绑定变量和自由变量的话题 然而 我对此感到困惑 术语 绑定变量 仅适用于形式参数变量吗 此外 文本还指出过程定义 绑定 其形式参数 这让我感到困惑 因为有些人说我们将值 绑定 到变量 显然 当我们谈论不同类型的变
  • R 的 C API 中的 SEXP 数据类型到底是什么以及为什么使用它? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道关于 SEXP 的维基百科页面 并且我知道它代表符号表达 我 模糊地 知道 SEXP 是指 Lisp 中的树数据结构的符号 但我
  • Clozure Common Lisp - TCP 套接字编程 - 发送回复

    我有一个非常小的程序 它打开一个套接字并接受一个连接 然后它会获取远程 IP 和端口 我想向远程计算机 telnet 发送一条短信并关闭连接 我无法确定哪个函数用于向 telnet 客户端发送消息 The Clozure手册 http cc
  • 防止 LISP 中的终端输出

    我想运行一个函数 但不让它在终端中输出结果 例如 set A B 正常返回B在控制台中如下所示 gt gt gt set A B B gt gt gt A B 我不希望它返回任何东西 我仍然希望该函数能够完成它应该做的事情 只是默默地 gt
  • 如何克服 emacs lisp 闭包缺少局部变量的问题

    我现在正在学习 Emacs Lisp参考手册 http www gnu org software emacs manual elisp html和 Common Lisp 来自LISP https rads stackoverflow co
  • 在 Parenscript 中使用 regex(正则表达式)

    我正在尝试 Parenscript 在尝试使用正则表达式函数时 我得到了意外的输出 例如 参考手册 https common lisp net project parenscript reference html shows regex f
  • 我应该在 Common Lisp 中使用哪些正则表达式库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • let* 和 set 之间的区别?在 Common Lisp 中

    我正在从事一个基因编程爱好项目 我有一个函数 宏设置 当以 setq setf 形式评估时 将生成一个如下所示的列表 setq trees make trees 2 gt x abs x 然后它将绑定到 lambda 函数
  • 任意类型说明符上的 Defmethod?

    我想做的是 defgeneric fn x defmethod fn x integer 1 Positive integer defmethod fn x integer 1 Negative integer 我想要一个可以与任意类型说明
  • 如何在 Clojure 中遍历一棵树,同时收集每个节点节点的值?

    我想创建一个函数来收集二叉树中每个节点的值 在 ClojureDocs 中 我发现了几个用于遍历树 图的函数 例如 tree seq prewalk 和 postwalk https clojuredocs org clojure core
  • 将列表传播到父代 sexp 中

    在任何 lisp 中是否有一种形式可以在父 sexp 中 传播 列表 喜欢 spread 1 2 3 gt 1 2 3 有两种方法可以做到这一点 哪个更好取决于您最终想要什么 一般来说 您可以使用 inside 反引号 表格如下 被评估以生
  • 在 Java Runtime.getRuntime().exec(...) 中使用引号和双引号

    我正在尝试在 Mac OSX 中从 Java 启动 Lisp 映像 使用控制台中的图像 我输入以下内容 lisp image eval package method some argument 一切都运行良好 在Java中 我在使用传递引号
  • Common Lisp 鼠标位置与 ltk

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

随机推荐

  • Java 是否保证当前同步的对象不会被垃圾回收?

    当线程持有其监视器时 是否可以保证对象不会被垃圾收集 e g class x private WeakReference r Object getMonitorObject Object o new Object r new WeakRef
  • 如何通过添加像素跟踪来跟踪各个收件人的阅读状态

    我正在构建一个电子邮件应用程序 其功能是在发送电子邮件后查看已读收件人 例如 如果我向 P1 发送了一封电子邮件并抄送 P2 和 P3 那么当 P1 打开电子邮件时 我作为发件人应该能够看到 P1 阅读了他们的电子邮件 为了实现这一目标 我
  • Firebase DB HTTP API 身份验证:何时以及如何刷新 JWT 令牌?

    我正在尝试使用 HTTP API 将 Python Web 应用程序写入 Firebase DB 我正在使用 Google I O 2016 上推出的新版本 Firebase 到目前为止 我的理解是 我想要完成的特定类型的写入是通过对此类型
  • MySQL字段类型如何转换?

    我已经遇到过转换函数 据我了解 基本语法是 select convert columnName targetFieldType as newColumnName from table 运行此命令不会给我任何错误 但是当我检查数据类型时它们没
  • WebGL 渲染抗锯齿

    我正在使用 webgl 和 javascript 有没有一种方法可以在不使用抗锯齿的情况下进行渲染 我需要每个像素都是纯色的 我当前的片段着色器非常简单 precision mediump float varying highp vec3
  • flutter 中出现无效的互联网地址错误

    我将图像上传到 Firebase Storage 然后获取图像的 Url 到 Firebase Storage 创建的图像链接 然后我将图像的 url 保存在 Firestore Documents 中 如果消息有图像并且当我想显示消息时
  • 您如何解释查询的解释计划?

    当尝试了解 SQL 语句如何执行时 有时建议查看解释计划 在解释 理解 解释计划时应该经历什么过程 什么应该脱颖而出 哦 这工作得很好 与 哦 不 那是不对的 每当我看到关于全表扫描不好而索引访问很好的评论时 我都会感到不寒而栗 全表扫描
  • __builtin_trap:什么时候使用它?

    gcc 提供了额外的内置函数 用于优化 其中之一是void builtin trap void 本质上是通过执行非法命令来中止程序 来自文档 builtin trap函数导致程序异常退出 GCC 实现了这个 通过使用目标相关机制 例如有意
  • SoundCloud API:audiomanager.js 上的 setVolume

    我们在使用 SoundCloud Javascript API 时遇到了 setVolume 函数的问题 踪迹 未捕获的 IndexSizeError 索引或大小为负数 或大于允许的值 音频管理器 js 2 HTML5AudioPlayer
  • SLURM:如何限制CPU作业数量以避免浪费GPU资源

    我们使用 SLRUM 在节点之间共享 CPU 和 GPU 资源 有时 GPU 作业无法提交 因为有人提交了满的 CPU 作业 这样的话 就浪费了GPU资源 我该如何制定政策来避免这种冲突 例如 是否可以限制 GPU 作业节点上的最大 CPU
  • 如何修复“compilerVersion”IIS 错误?

    我收到这个异常 System Configuration ConfigurationErrorsException 的值 提供程序选项中的 compilerVersion 属性必须是 v4 0 或 如果您正在编译 4 0 或更高版本的 NE
  • JMS/消息队列的实际使用? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我刚刚阅读了一些有关 JMS 和 Apache ActiveMQ 的内容 想知道这里的人们使用 JMS 或类似的消息队列技术在现实世界
  • 调用可以抛出错误,但错误不能从全局变量初始值设定项中抛出

    我正在使用 Xcode 7 beta 迁移到 Swift 2 后 我遇到了这行代码的一些问题 let recorder AVAudioRecorder URL soundFileURL settings recordSettings as
  • WordPress 重写仅向页面添加基本前缀

    我在尝试完成一个项目时遇到了一个问题 我将当前的永久链接结构设置为 postname 我创建了自己的函数 只为帖子提供前缀 因此我的帖子被重写为 prefix postname 我的问题是我想更改的永久链接pages正如我对帖子所做的那样
  • 在哪里可以找到 libsystem_c.dylib 的源代码?

    我的堆栈跟踪中有一行奇怪的行 我想进一步调查 12 libsystem c dylib 0x3aa272dc free 168 如果我理解正确的话 libsystem c 是 C 标准库 iOS使用的版本是开源的吗 我在哪里可以获得该来源
  • 使用 nodemailer 发送邮件 - 来自字段的电子邮件不正确

    尝试使用 nodemailer 设置联系表单 这是我的 app js 中的内容 EMail configuration var smtpTransport nodemailer createTransport SMTP service Gm
  • 具有自定义类的多维数组

    我正在寻找一个数组声明 初始化和访问数组 该数组将具有 表 数组 及其行 将如下所示 CusomClass1Instance Number CusomClass2Instance CusomClass1Instance Number Cus
  • 如何在不先创建索引的情况下查询变量字段并应用排序?

    编辑 我简化了问题和示例 因为这个问题仅 一旦您开始使用即适用orderBy 我有一个用户集合 其中每个用户都订阅了许多变量 如下所示 user var1 true var2 true var2 true metric 10 我这样做是因为
  • ssrs 2008级联参数

    我目前正在使用 SQL 2008 R2 和 SQL Server Report Service 2008 我正在使用以下参数创建报告 Staff name Client name Lab lab date 等 当用户选择 Staff 名称时
  • Common Lisp 类型声明未按预期工作

    当我在 Common Lisp 中定义一个函数时 如下所示 defun foo n declare type fixnum n n 42 我期待一个像这样的电话 foo a 立即失败 但在调用时失败 是个declareform 不保证静态类