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 类型声明未按预期工作 的相关文章

  • 有没有一种简单的方法可以使用 Common Lisp 中的 Python 库?

    在编写 Common Lisp 代码时我真正怀念的一件事是访问 Python 库 包括标准库和第三方模块 CLPython 提供了 Python 功能的有限子集 这阻止了大多数库的使用 因此这对我来说并不是很有用 我希望能够从 Common
  • windows下无法用emacs + sbcl启动slime

    我想配置我的 emacs 以使用 SLIME 和 SBCL emacs 文件如下所示 add to list load path D app slime setq inferior lisp program sbcl require sli
  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 解决斐波那契数列的 Lisp 方法

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

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看
  • 什么是 S 表达式

    所有 Lisp 开发人员似乎都知道什么是 S 表达式 但有人能为非 Lisp 开发者解释一下这一点吗 已经有一个维基百科条目 https en wikipedia org wiki S expression https en wikiped
  • 如何说服 Lisp SBCL 进行内联 Fixnum 算术?

    我在其他 SO 答案中找到了一些技术 但显然我无法说服 SBCL 进行内联修复数算术 declaim optimize speed 2 safety 1 declaim ftype function fixnum fixnum double
  • 为什么我们在 Lisp 中需要 funcall?

    为什么我们必须使用funcall在 Common Lisp 中调用高阶函数 例如 为什么我们必须使用 defun foo test func args funcall test func args 而不是更简单的 defun bar tes
  • Python 宏:用例?

    如果 Python 有一个类似于 Lisp Scheme 的宏工具 比如元Python https code google com p metapython 你会如何使用它 如果您是一名 Lisp Scheme 程序员 您会使用宏来做什么
  • 如何定义所有成员均为给定类型的列表

    我对 CL 类型系统有点陌生 但我认为像下面这样的东西可以工作 deftype list of type labels check all l every lambda item typep item type l and list sat
  • 在 cl-mongo 中实现 MongoDB SASL 身份验证

    我已经从 fons 分叉了 cl mongo common lisp MongoDB 库 存储库 因为它已经不再维护并且不支持 SCRAM SHA 1 登录过程 这是我的叉子 https github com mprelude cl mon
  • 更改 Common Lisp REPL 中文本的颜色

    我想控制 Common Lisp 中显示的文本的颜色 像这样的伪代码 print color red hello blue world 有什么办法可以做到这一点吗 我使用 SBCL 我的 repl 位于 emacs 内 谢谢 您可以使用AN
  • 如何从 SBCL 解释器将特定函数写入文件?

    假设我在没有 SLIME 的情况下玩过 SBCL 没有任何简单的解释器 现在我想将几个函数保存在一个文件中 不是核心图像 只是文本形式的一些代码 我该怎么做呢 有两种方法可以做到这一点 使用DRIBBLE and or FUNCTION L
  • Common Lisp 反引号/反引号:如何使用?

    我在使用 Lisp 的反引号读取宏时遇到问题 每当我尝试编写一个似乎需要使用嵌入式反引号的宏时 例如 w x y 来自保罗 格雷厄姆的ANSI 通用 Lisp 第 399 页 我不知道如何以编译的方式编写代码 通常 我的代码会收到一整串错误
  • 如何在 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
  • Lisp:CHAR 既未声明也未绑定

    几天前我决定学习 通用 Lisp 我意识到这是一个相当新手的问题 对于至少有一点经验的人来说可能非常微不足道 所以基本上发生的事情是我加载 Emacs Slime 通过 Lisp in a Box 并编写我的程序 包括在下面 defun l
  • defvar、defparameter、setf 和 setq 之间有什么区别

    我找到了一个类似问题 https stackoverflow com questions 3855862 setq and defvar in lisp 但我不太明白这个解释 所以我尝试使用以下示例运行 clisp 1 gt defvar
  • 我如何访问 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 有什么提示吗
  • 一次性的 lisp 宏,我的实现正确吗?

    我正在尝试从 Peter Seibel 的书 Practical Common Lisp 中学习 Lisp 在第 8 章 宏 定义你自己的 http www gigamonkeys com book macros defining your

随机推荐

  • 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 不保证静态类