首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

lisp-在访问控制模型中销毁obj时,“car: contract violation expected: pair? given:()”

在Lisp中,当你尝试对一个空列表(())执行car操作时,会出现“contract violation expected: pair? given: ()”的错误。这是因为car函数期望其参数是一个非空列表(即一个pair),而空列表不是一个pair。

以下是一些可能导致这个错误的常见情况和解决方法:

情况1:尝试对空列表使用car

代码语言:javascript
复制
(car ()) ; 错误:contract violation expected: pair? given: ()

解决方法: 确保在调用car之前检查列表是否为空。

代码语言:javascript
复制
(if (not (null list))
    (car list)
    nil) ; 或者其他适当的默认值

情况2:在销毁对象时访问其属性

假设你有一个对象表示为一个列表,其中第一个元素是对象的类型,后续元素是属性。

代码语言:javascript
复制
(defstruct my-object type data)

(defvar *obj* (make-my-object :type 'example :data (list 1 2 3)))

如果你在销毁对象时尝试访问其属性,但没有正确检查对象是否存在,可能会导致这个错误。

代码语言:javascript
复制
(defun destroy-object (obj)
  (when obj
    (setf *obj* nil)
    (car (my-object-data obj)))) ; 错误:如果*obj*已经被设置为nil,这里会出错

解决方法: 确保在访问对象属性之前检查对象是否存在。

代码语言:javascript
复制
(defun destroy-object (obj)
  (when obj
    (let ((data (my-object-data obj)))
      (setf *obj* nil)
      data)))

情况3:递归函数中的空列表处理

如果你在递归函数中处理列表,并且在某个点上列表变为空,但没有正确处理这种情况,也会导致这个错误。

代码语言:javascript
复制
(defun process-list (lst)
  (if (null lst)
      nil
      (cons (car lst) (process-list (cdr lst))))) ; 如果lst在某个点是(),这里会出错

解决方法: 确保在递归调用之前检查列表是否为空。

代码语言:javascript
复制
(defun process-list (lst)
  (if (null lst)
      nil
      (cons (car lst) (process-list (cdr lst)))))

总结

关键是要始终检查列表是否为空,特别是在进行car操作之前。通过添加适当的检查和默认值,可以避免“contract violation expected: pair? given: ()”错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

exception: access violation reading 0xFFFFFFFFFFFFFFFF

试图访问已被销毁的对象总结起来,当我们遇到 "exception: access violation reading 0xFFFFFFFFFFFFFFFF" 异常时,我们需要仔细检查代码,查找导致异常的原因...delete obj; // 销毁对象 obj = nullptr; // 将指针设置为空指针,避免使用已被销毁的对象 // ... if (obj !...为了避免使用已被销毁的对象,我们将指针 obj 设置为空指针,并在访问对象成员之前检查其有效性。...这些示例代码展示了在实际应用场景中可能导致 "exception: access violation reading 0xFFFFFFFFFFFFFFFF" 异常的问题,并提供了相应的解决方法。...使用空指针的一个常见场景是在动态内存分配时,当内存分配失败时,返回一个空指针作为错误标志。例如,在C++中,当使用new来进行对象的动态内存分配时,如果内存不足或发生其他错误,将返回一个空指针。

1.7K10
  • 【Python基础编程】继承、重写与super详解

    这种方式可以控制数据的访问和修改,并在访问或修改时执行额外的操作。 示例: class MyClass: def __init__(self, value): self....输出: 100 二、隐藏功能 在Python中隐藏功能或方法的主要作用与隐藏数据类似,但更侧重于控制类或模块的行为和接口。...整体对象负责创建和销毁部分对象,这意味着当整体对象被销毁时,部分对象也会被销毁。...当Car对象被销毁时,其内部的Engine对象也会被销毁。 (四)继承 继承用于表示子类继承父类的属性和方法。继承允许子类复用父类的代码,同时可以添加或修改功能。...它是面向对象编程中的一个重要工具,尤其在涉及继承和方法重写时,可以帮助你在子类中调用父类的实现。使用 super() 函数可以确保子类在扩展父类功能的同时,还能够利用父类已经实现的功能。

    14300

    【Java线程】线程安全三元素:原子性、可见性、有序性

    《Java并发编程实战》书中给出定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步,这个类都能表现出正确的行为,那么这个类就是线程安全的...原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作; 例如:atomicXXX类,synchronized关键字的应用。...如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。 什么是java内存模型?...(Java Memory Model,简称JMM) JMM描述了java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。...—重排序 在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

    43620

    慕课网高并发实战(四)- 线程安全性

    定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确行为,那么就称这个类是线程安全的 ?...} } 补充知识点,jvm对long,double这些64位的变量拆成两个32位的操作 LongAdder的设计思想:核心是将热点数据分离,将内部数据value分成一个数组,每个线程访问时...两种方法来确保可见性 JMM(java内存模型)关于synchronized的两条规定 线程解锁前,必须把共享变量的最新值刷新到主内存 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值...对volatile变量读操作时,会在读操作前加入一条load屏障指令,从主内存中读取共享变量 ?...有序性 Happens-before原则,先天有序性,即不需要任何额外的代码控制即可保证有序性,java内存模型一个列出了八种Happens-before规则,如果两个操作的次序不能从这八种规则中推倒出来

    52120

    【Java】CAS及其缺点和解决方案梳理

    在Java并发中,最初接触的应该就是Synchronized关键字了,但是Synchronized属于重量级锁,很多时候会引起性能问题,虽然在新的 JDK 中对其已经进行了优化。...首先先来看一个例子 当有很多个线程同时访问一个贡献资源时,无法保证的贡献资源只被一个线程使用,如果要保证只有一个线程使用时,最先想到的一般就是加锁。...首先要剖析add方法里面的代码,一方面在方法上加了锁,导致线程只能串行化,而且线程在方法中sleep了5毫秒,才进行NUMBER++,另一方面**在进行NUMBER++中,NUMBER++也并非原子操作...* to the given update values if the * current reference is {@code ==} to the expected reference *...(newReference, newStamp))); } 由于每个过程值都会有对应的版本,所以在修改过程中需要传入期望版本和当前的值,数据库的多版本并发控制也类似,先来看一下修改后的代码: static

    41940

    【JUC进阶】04. 无锁CAS

    given updated value * if the current value {@code ==} the expected value...在执行CAS操作时,硬件会比较内存地址V的当前值和期望值A,并根据比较结果来决定是否更新内存地址V的值。 CAS操作的优势在于它避免了传统锁机制的开销,如线程阻塞和上下文切换。...Unsafe类中的方法可以用于执行一些不安全的操作,比如直接操作内存、分配和释放内存、对象的创建和销毁、线程挂起和恢复等。...它可以被认为是一种"黑魔法",因为它绕过了Java语言的安全性和限制,提供了对底层操作的直接控制。 在CAS操作中,compareAndSwapXXX系列方法就是用Unsafe类来进行的。...在一般情况下,应该优先使用高级抽象和标准库提供的线程安全机制,只有在特定需求下,且对其使用有深入的了解和必要的安全措施时,才应考虑使用Unsafe类。

    17710

    【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】

    相关知识 为了完成本关任务,你需要掌握 不同访问属性的成员的访问方式 构造函数和析构函数的执行过程 类的组合使用方法 一、不同访问属性成员的访问方式 访问控制符:在 C++ 中,类的成员(包括数据成员和成员函数...)可以有三种访问控制符:public(公共的)、private(私有的)和protected(受保护的)。...但是,protected成员可以在派生类(继承该类的子类)中访问。...析构函数 定义和作用:析构函数也是一种特殊的成员函数,它的名字是在类名前面加上~符号,没有参数和返回值类型。它主要用于在对象销毁时释放资源,如动态分配的内存、打开的文件等。...例如: int main() { MyClass obj1; // 在栈上创建对象,作用域结束时析构函数被调用 MyClass* obj2 = new MyClass; // 使用obj2

    12210

    PHP.步步为营 | 类与面向对象 知识详析 与 运用实例

    访问控制的关键字代表的意义为: public:公开的 protected:受保护的 private:私有的 class Car { //定义公共属性 public $name =...定义类的方法 方法就是在类中的function, 很多时候我们分不清方法与函数有什么差别, 在面向过程的程序设计中function叫做函数, 在面向对象中function则被称之为方法。...同属性一样,类的方法也具有public,protected 以及 private 的访问控制。...访问控制 访问控制通过关键字public,protected和private来实现。 被定义为公有的类成员可以在任何地方被访问。 被定义为受保护的类成员则可以被其自身以及其子类和父类访问。...; 在设计模式中会经常使用这样的方法来控制对象的创建, 比如单例模式只允许有一个全局唯一的对象。

    1K50

    SushiSwap协议分析

    协议简介 SushiSwap是一个分叉自Uniswap的去中心化交易协议,它在交易模式上延续了Uniswap的核心设计——AMM(自动做市商)模型,但与Uniswap不同之处在于SushiSwap增加了经济奖励模型...,在函数退出timelock之后,可以用5个团队多重签名中的3个来执行,下图是SushiSwap合约中timelock的记录信息: https://app.sushi.com/governance ?...* pool.accSushiPerShare) - user.rewardDebt 同时可以从注释信息中看到用户在进行存取LP tokens时,池子中的accSushiPerShare、lastRewardBlock...SushiBar is ERC20("SushiBar", "xSUSHI"){ 之后在构造函数中初始化了SUSHI合约的地址 // Define the Sushi token contract...解决方案:合理设置owner的权限 文末小结 SushiSwap是在UniswapV2协议的基础上进行了拓展,因为其紧急奖励模型更加偏向于用户利益,所以它相较与UniswapV2更容易吸引更多用户参与质押来提供流动性

    2.2K41

    ECMAScript13 中11个令人惊叹的 JavaScript 新特性

    静态方法可以使用关键字this访问类中的其他私有/公共静态成员,实例方法可以使用this.constructor访问他们。...此外,你还可以通过块中的 super 关键字访问超类的静态属性。这为开发者提供了更多的灵活性和控制能力。...console.log(house.hasColor.call(car)); // false 7.at() 索引方法 在 JavaScript 中,我们通常使用方括号[]来访问数组的第 t 个元素。...this class has a given property....然而,在处理大型数组时,这种方法可能会导致性能问题,因为需要复制整个数组。 此外,findIndex()方法在反转数组时仍然无法达到预期效果,因为元素的反转会导致它们在原始数组中的索引改变。

    25820

    SpringBoot基础(五):集成JUnit5

    它支持在不同的环境中运行测试,如命令行、IDE或构建工具(例如Maven、Gradle) JUnit Jupiter:这个模块包含了JUnit5的新测试编写和扩展模型,提供了全新的注解、测试方法和扩展机制...中,测试类和测试方法必须是public的,因为JUnit4通过反射机制要求访问公共方法 而JUnit5则没有这种要求,测试类和方法的可见性设为包级(默认)足够 JUnit 5 框架执行测试 因为 JUnit...(expected, actual); 8、assertSame(expected, actual) 验证两个对象引用是否指向同一个对象(即是同一个对象的引用) Object obj = new Object...(); assertSame(obj, obj); 9、assertNotSame(expected, actual) 验证两个对象引用是否不指向同一个对象 Object obj1 = new Object...someCondition) { fail("Unexpected condition occurred"); } 11、带有消息参数的断言 JUnit的断言方法通常有一个变体,可以带有一个额外的字符串参数,用于在测试失败时提供错误消息

    10710

    PythonOOP面向对象编程1

    对象是指现实中的物体或实体(拥有一系列变量、函数(方法)的) 什么是面向对象? 把一切看成对象(实例),让对象和对象之间建立关联关系 对象都有什么特征?...析构方法 语法: class 类名(继承列表): def del(self): 语句块 说明: 析构方法在对象销毁时被自动调用 作用: 清理此对象占用的资源 Python不建议在析构方法内做任何事情...def __del__(self): print(self.name, "对象已经销毁") c1 = Car('BYD E6') c1 = Car('BMW x5') 汽车 BYD E6...__class__.count -= 1 # 当车被销毁总数减1 b1 = Car("BYD") b2 = Car("TTESLA") b3 = Car("AUDI") print("当前汽车总数是"..., Car.count) del b3 print("当前汽车总数是", Car.count) BYD 被创建 BYD 被销毁 TTESLA 被创建 TTESLA 被销毁 AUDI 被创建 当前汽车总数是

    36710

    以太坊智能合约设计模式

    一旦被销毁,就不可能调用合约的功能,也不会在账本中记录交易。 现在的问题是:“为什么我要销毁合约?”。 有很多原因,比如某些定时合约,或者那些一旦达到里程碑就必须终止的合约。...在处理一个被销毁的合约时,有一些需要注意的问题: 合约销毁后,发送给该合约的交易将失败 任何发送给被销毁合约的资金,都将永远丢失 为避免资金损失,应当在发送资金前确保目标合约仍然存在,移除所有对已销毁合约的引用...这些子合约可以被称为“资产”,可以表示现实生活中的房子或汽车。 工厂用于存储子合约的地址,以便在必要时提取使用。 你可能会问,为什么不把它们存在Web应用数据库里?...这两个函数的区别在于,在交易异常时,send()不会抛出异常,而只是返回布尔值false ,而transfer()则会抛出异常。 为什么这一点很重要?...现在,只要我们在refund函数中调用contractWithError.transfer() ,就会抛出异常并停止迭代遍历。

    1.1K31

    solidity智能合约的经典设计模式

    一旦被销毁,就不可能 调用合约的功能,也不会在账本中记录交易。 现在的问题是:“为什么我要销毁合约?”。 有很多原因,比如某些定时合约,或者那些一旦达到里程碑就必须终止的合约。...在处理一个被销毁的合约时,有一些需要注意的问题: 合约销毁后,发送给该合约的交易将失败 任何发送给被销毁合约的资金,都将永远丢失 为避免资金损失,应当在发送资金前确保目标合约仍然存在,移除所有对已销毁合约的引用...这些子合约可以被称为“资产”,可以表示现实生活中的房子或汽车。 工厂用于存储子合约的地址,以便在必要时提取使用。 你可能会问,为什么不把它们存在Web应用数据库里?...这两个函数的区别在于, 在交易异常时,send()不会抛出异常,而只是返回布尔值false ,而transfer()则会抛出异常。 为什么这一点很重要?...现在,只要我们在refund函数中调用contractWithError.transfer() ,就会抛出 异常并停止迭代遍历。

    1.4K80
    领券