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

尝试在DrRacket中实现我自己的堆栈对象

在DrRacket中实现自己的堆栈对象可以通过定义一个堆栈类来实现。堆栈是一种数据结构,遵循先进后出(LIFO)的原则,可以用来存储和管理数据。

以下是一个示例的堆栈类的实现:

代码语言:scheme
复制
(define stack
  (class object%
    (init-field data)
    
    (define/public (push item)
      (set! data (cons item data)))
    
    (define/public (pop)
      (if (empty?)
          (error "Stack is empty")
          (begin
            (define item (car data))
            (set! data (cdr data))
            item)))
    
    (define/public (empty?)
      (null? data))
    
    (define/public (size)
      (length data))
    
    (super-new)))

上述代码定义了一个名为stack的类,该类包含了以下几个方法:

  • push:将元素添加到堆栈的顶部。
  • pop:从堆栈的顶部移除并返回元素。
  • empty?:检查堆栈是否为空。
  • size:返回堆栈中元素的数量。

要使用这个堆栈类,可以创建一个堆栈对象并调用相应的方法。以下是一个使用示例:

代码语言:scheme
复制
(define my-stack (new stack (data '())))

(send my-stack push 1)
(send my-stack push 2)
(send my-stack push 3)

(displayln (send my-stack pop)) ; 输出:3
(displayln (send my-stack pop)) ; 输出:2
(displayln (send my-stack pop)) ; 输出:1

(displayln (send my-stack empty?)) ; 输出:#t
(displayln (send my-stack size)) ; 输出:0

在这个示例中,我们首先创建了一个空的堆栈对象my-stack。然后,我们使用push方法将元素1、2和3依次添加到堆栈中。接下来,我们使用pop方法从堆栈中依次移除并输出元素。最后,我们使用empty?方法检查堆栈是否为空,并使用size方法获取堆栈中元素的数量。

请注意,这只是一个简单的示例,实际的堆栈实现可能需要更多的功能和错误处理。此外,DrRacket支持多种编程语言,如Scheme、Racket等,你可以根据自己的需求选择适合的语言来实现堆栈对象。

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

相关·内容

动态代理对象 IronPython 实现

动态代理对象是一种设计模式,允许在运行时动态地创建对象,并在这些对象上拦截和处理方法调用。它常用于 AOP(面向方面编程)、日志记录、权限控制等场景。应用非常广泛,下面跟着来聊一聊遇到问题。...1、问题背景 IronPython ,有时我们需要创建一个动态代理对象,以便在运行时动态呈现底层结构。这个代理对象本身不应该有任何函数和属性,我们希望捕获运行时中所有调用。...= o # 需要调用 underlying.myproperty_set(o)我们查看了 Python 特殊函数列表,但没有找到任何合适方法。...我们还尝试对象即时创建属性,结合使用 exec() 和内置 property() 函数,但发现 IronPython 1.1.2 缺少整个 'new' 模块( IronPython 2.x beta...这种方式 IronPython 实现了动态代理对象,可以灵活地拦截和处理方法调用。根据需要,可以包装器函数添加更多逻辑,如日志记录、权限检查等。

11410

Python实现自己推荐系统

电子商务、社交媒体、视频和在线新闻平台已经积极部署了它们自己推荐系统,以帮助它们客户更有效选择产品,从而实现双赢。 两种最普遍推荐系统类型是基于内容和协同过滤(CF)。...本教程,你将使用奇异值分解(SVD)实现基于模型CF和通过计算余弦相似实现基于内存CF。 我们将使用MovieLens数据集,它是实现和测试推荐引擎时所使用最常见数据集之一。...总结一下: 在这篇文章,我们讲了如何实现简单协同过滤方法,包括基于内存CF和基于模型CF。 基于内存模型是基于产品或用户之间相似性,其中,我们使用余弦相似性。...标准协同过滤方法在这样设置下表现不佳。接下来教程,你将深入研究这一问题。...实现自己推荐系统.md

2.9K100
  • 自己桌面端应用运行了小程序

    作为程序员必须要(xia)精(zhe)进(teng),就单纯有一天突然奇想,能否做到像微信一样桌面应用也跑上自己小程序呢?...但这也是一种天马行空想法,调研了一番,路径一:自己造轮子,这是不可能,没有这个精力和时间。...这样来讲,通过桌面应用集成 SDK ,其实也算是实现了 Windows、macOS 等桌面平台跨端。...SDK 前还需要在 FinClip 后台上架小程序,上架了官方示例小程序代码包,也尝试了直接把微信小程序代码包上传到 IDE ,发现也能兼容。...图片个人认为一些企业做OA模块化开发还挺适合在桌面端用小程序,毕竟小程序能够实现动态化更新,不必硬要通过迭代更新实现。好了以上就是瞎折腾全过程,欢迎各位大佬拍砖。

    1.4K30

    WCF之旅(3):WCF实现双工通信

    一、两种典型双工MEP 1.请求过程回调 这是一种比较典型双工消息交换模式表现形式,客户端进行服务调用时候,附加上一个回调对象;服务在对处理该处理,通过客户端附加回调对象(实际上是调用回调服务代理对象...实现了上面定义服务契约ICalculator服务CalculatorService实现了Add操作,完成运算和结果显示工作。...结果显示是通过回调方式实现,所以需要借助于客户端提供回调对象(该对象客户端调用CalculatorService时候指定,介绍客户端代码实现时候会讲到)。...客户端程序为回调契约提供实现,在下面的代码CalculateCallback实现了回调契约ICallback,DisplayResult方法对运算结果进行输出。...WCF通过加锁机制保证服务对象独占性使用,也就是说服务执行开始会对服务对象加锁,该锁在服务操作结束之后释放。 回到我们例子,Add操作执行过程,服务端回调客户端操作进行运算结果显示工作。

    1.1K100

    走进 racket(lisp) 世界

    上周追着看了个大牛好几篇文章,发现一个叫racket语言出镜率颇高 —— 这已经是十月来第三次从各种大牛文章接触这个词。...✓ 爱不释手:学习了全部语法,看作者编写书,遇到项目时会想想能不能用xxx实现,怎么实现。如golang,erlang。 ✓ 日常使用:只要是需要写代码地方,下手首先想到就是TA。...和markdown等不同地是,scribble里,你可以混入racket代码,做各种各样事情:比如说文档嵌入plot。由于程序君还没有写过复杂基于scribble文档,所以无法说得更多。...racket其它优点,都或多或少跟lisp有关,这个觉得自己不必多讲。...racket之旅刚刚开始,希望这份热情随着自己对 define-syntax 深入了解能够继续下去。等有了更多心得后,撰文表述。:)

    2.5K30

    【Java 进阶篇】Java Web应用实现请求数据共享:域对象详解

    本文将详细探讨域对象概念,以及如何在Java Web应用中使用域对象实现请求数据共享。 什么是域对象? 域对象是一种Java Web应用中用于存储数据容器。...会话域(Session域):会话域是一种用于整个用户会话周期内共享数据对象。数据存储会话对象,可在用户登录后多次请求之间共享。...这些域对象允许开发人员不同组件传递和存储数据,从而实现数据共享和协作。 请求域(Request域) 请求域是一种用于同一次HTTP请求处理周期内共享数据对象。...这个应用程序名称可以整个应用程序所有Servlet中共享。 总结 域对象Java Web应用实现数据共享和传递重要工具。...通过正确使用这些域对象,开发人员可以实现数据共享和协作,从而提高Web应用灵活性和功能性。 开发Java Web应用时,了解如何使用域对象对数据进行共享是非常重要

    52320

    C++ 虚函数详解:多态性实现原理及其面向对象编程应用

    面向对象编程,多态性是一个非常重要概念。多态性意味着不同上下文中使用同一对象时,可以产生不同行为。...C++是一种面向对象编程语言,C++,虚函数是实现多态性关键 什么是虚函数 虚函数是一个基类声明函数,它可以被子类重写并提供不同实现。...使用虚函数时,可以将基类指针或引用指向派生类对象,这样就可以实现多态性调用。...总结 虚函数是实现多态性关键,它允许不同对象表现出不同行为。当使用基类指针或引用来访问派生类对象时,虚函数将调用派生类实现实现了运行时多态性。...面向对象编程,多态性是一个非常重要概念,可以使代码更加灵活、可扩展和易于维护。多态性有两种形式:静态多态和动态多态。静态多态是通过函数重载实现,而动态多态是通过虚函数实现

    97710

    实现一个JNI调用Java对象工具类,从此一行代码就搞定!

    java函数就会产生大量上述代码,由此产生了一个开发封装这些操作工具类,以便大量简化我们开发。...而在jni,与java对应类型其实就那么十几种,所以我们只要全部实现一遍call2Result即可。...undefined reference to 使用模版函数出现这个问题,是因为没有将模版函数实现写在头文件,只将模版函数声明头文件,而在源文件实现。...所以我们应该将模版函数实现也写进头文件,而模版函数特例化则可以源文件实现,但是注意要include头文件。...总结 上面我们仅仅是实现了调用普通函数工具,根据这个思路我们还可以实现调用静态函数、获取成员变量、赋值成员变量等,这样当我们进行jni开发时候,如果需要对java对象或类进行操作,只需要一行代码就可以了

    1.8K20

    GEEK心思你别猜

    文本化幻灯片 - Slideshow 作为一名体面的程序员,作为一名被Unix文化侵染程序员,作为一名希望世界是由简单纯文本构成程序员,生活充满太多无奈。...HuKai一篇blog里介绍了一个很酷工具——Dot,它提供了一种可以基于文本描述图形简洁DSL。利用这个DSL,可以绘制出相当复杂图案。激动之余,开始寻找文本化幻灯片方法。...于是,发现了DrRacket(它前身就是大名鼎鼎DrScheme)。DrRacket是MIT开发Scheme运行时,其中包含一个制作幻灯片组件,名曰Slideshow。...Slideshow,最核心概念是pict和slide。slide自然表示一张幻灯片,它是由一个或多个pict按照不同顺序排列组成。slideshow源代码以rkt为后缀名。...t是Slideshow众多返回pict函数之一。

    59740

    dotnet 代码调试方法

    ,再从异常窗口开启 异常调试过程调用堆栈可以发现调用方法逻辑是否合预期 不需要符号文件和源代码都可以进行异常调试 异常调试需要依赖具体代码实现,如果在代码实现过程没有考虑异常,那么将无法进行异常调试...开始调试之前,需要先确定自己代码是否清真。应该假定调用接口是符合预期,和所使用框架是稳定 如果拿到库不是稳定库,或从接口实现上无法明确。...,此时可以尝试使用异常调试方法 调试对象 VisualStudio 中提供了给某个对象添加 ID 功能,软件运行过程,整个进程有超级多对象被创建,而在调试时候经常发现了修改了某个对象属性或值但实际上没有应用上...异常调用堆栈信息里面可以看到方法调用顺序 好例子 用一个好例子说明异常调试 尝试小伙伴写一个库,写了这样代码 var f2 = new F2();...在外层拿到 e 将会丢失了 Foo 里面的堆栈信息 更多方法 推荐小伙伴阅读以下博客了解代码如何写 .NET/C# 建议异常处理原则 - walterlv 应该抛出什么异常?

    1.4K10

    CAPTAIN HOOK - 如何(不)寻找 JAVA 应用程序漏洞

    寻找 Java 应用程序漏洞好时机!在过去几个月里,一直尝试构建一个名为Captain Hook工具,它使用动态方法来查找大型闭源 Java 应用程序一些有趣(安全方面)特性。...在此过程尝试了许多仪器工具和技术,但很难找到满足所有需求工具和技术。本文中,将总结通过许多(一些失败,一些成功)尝试所学到东西。...通过自己组件运行该工具,确实应该可以使其与目标软件要求无关,例如所需操作系统。...当断点命中时,每个参数都以调试器实现接口对象形式检索,这是对虚拟机实际对象引用。只要对象没有主 JVM 中被垃圾收集,该引用就有效。...该工具架构如下所示: executeSafe execute 在这里,发现自己遇到了另一面墙:Java 调试接口字节码级别( JVM )起作用,而 frida-agent 本机代码级别

    81810

    MQ消费端线程“突然挂掉”??或许只是异常没catch

    此方法开了线程池去执行消费消息逻辑,但是走到一行打印日志代码时候,突然不执行了。 ? 然后就没了,也没有报任何异常,下面的其他逻辑也没有执行。怀疑是线程挂了。...尝试换成了其他打印日志。再次观察。发现可以打出来,就那条打不出来。 ? 继续查看堆栈,线程仍然存活,因为个数没有超过核心数,会阻塞等待队列任务。 ?...于是尝试,将@autowire注入改为了 构造注入。重新启动任务,发现ok了!~ 能打印出来这个注入变量了! 这就开始猜测,是否之前这个变量有问题,或许报了null指针,但是没有报异常。...然后查看堆栈,发现线程也会像之前一样消失。 那就说明了, 这个方法里面的所以异常,如果你不自己try catch的话,那么就不会报,也不会打印。看源码便知道, ?...感兴趣可以点我看下。 而我依赖注入实例构造器里面有一个稍微耗时逻辑。

    1.2K30

    MQ消费端线程“突然挂掉”?或许只是异常没catch

    此方法开了线程池去执行消费消息逻辑,但是走到一行打印日志代码时候,突然不执行了。 然后就没了,也没有报任何异常,下面的其他逻辑也没有执行。怀疑是线程挂了。...尝试换成了其他打印日志。再次观察。发现可以打出来,就那条打不出来。 继续查看堆栈,线程仍然存活,因为个数没有超过核心数,会阻塞等待队列任务。...于是尝试,将@autowire注入改为了 构造注入。重新启动任务,发现ok了!~ 能打印出来这个注入变量了! 这就开始猜测,是否之前这个变量有问题,或许报了null指针,但是没有报异常。...然后查看堆栈,发现线程也会像之前一样消失。 那就说明了, 这个方法里面的所以异常,如果你不自己try catch的话,那么就不会报,也不会打印。...感兴趣可以点我看下。 而我依赖注入实例构造器里面有一个稍微耗时逻辑。

    60410

    CVE-2017-5123 漏洞利用全攻略

    需要注意一点是:这些用户访问函数在内存读写过程处理页面错误,访问未映射内存时不会导致崩溃。 漏洞 某些系统调用要求多次调用put/get_user以实现内核与用户区之间数据复制。...辗转思考多种漏洞利用方法后确定了几个方向: 在内核数据段找到一个对象,其索引/大小/值为零将导致超出内存访问边界; 在内核覆盖一个自旋锁,用来创建竞争条件; 尝试覆盖内核堆栈基址指针或其他值; 触发可能导致在内核堆栈上创建有用结构操作...考虑到Linux内核堆栈并非自身擅长领域,先喷射10000个线程,然后使用调试器检查任务结构堆栈位置。注意到,喷射对象达到一定数量后,大部分任务结构将在堆栈较低地址处结束。...策略是在用户区分配大量内存,然后尝试随机覆盖内核physmap页面,同时检查用户区页面是否已经改变。...现在覆盖task_structfiles指针,使其指向内核“alias”,在用户区构造一个伪造files_struct对象,该对象也将位于alias.file对象,好处在于它们包含函数指针,

    1.6K70

    CVE-2017-5123 漏洞利用全攻略

    需要注意一点是:这些用户访问函数在内存读写过程处理页面错误,访问未映射内存时不会导致崩溃。 漏 洞 某些系统调用要求多次调用put/get_user以实现内核与用户区之间数据复制。...辗转思考多种漏洞利用方法后确定了几个方向: 在内核数据段找到一个对象,其索引/大小/值为零将导致超出内存访问边界; 在内核覆盖一个自旋锁,用来创建竞争条件; 尝试覆盖内核堆栈基址指针或其他值; 触发可能导致在内核堆栈上创建有用结构操作...考虑到Linux内核堆栈并非自身擅长领域,先喷射10000个线程,然后使用调试器检查任务结构堆栈位置。注意到,喷射对象达到一定数量后,大部分任务结构将在堆栈较低地址处结束。...策略是在用户区分配大量内存,然后尝试随机覆盖内核physmap页面,同时检查用户区页面是否已经改变。...现在覆盖task_structfiles指针,使其指向内核“alias”,在用户区构造一个伪造files_struct对象,该对象也将位于alias.file对象,好处在于它们包含函数指针,

    1.3K70

    数据结构 API

    如果让你记下给你一系列数字,然后最后问我是否给了你一个特定数字,你可能会在记忆做到这一点。但如果要求你计算机程序这样做,你就必须选择如何存储数据。...由于我们想要跟踪只是我们是否收到了一个特定数字,我们可以将这些数字存储一个对象,并在true我们收到它们时将它们值设置为: const receivedNumbers = { } ; const...,但因为从对象检索值比遍历数组快得多,所以总体结果会更快。...数组 API提供了许多有用功能,从在数组开头和结尾添加和删除元素,到每个元素上调用函数迭代器方法。但是,如果您想在数字数组中找到最小数字,则必须自己实现该功能。...创建您自己 API 构建自己数据结构时,您将实现创建公共 API 功能。

    14820

    iOS Crash不崩溃

    用户使用App过程,经常遇到闪退情况,体验不太好,本文尝试探索引发闪退原因,以及遇到crash情况下,尽可能保持程序运行,并及时上报错误。...该函数我们可以输出栈信息,版本信息等其他一切我们所想要。 SIGKILL:用来立即结束程序运行信号。 SIGSEGV:试图访问未分配给自己内存, 或试图往没有写权限内存地址写数据。...以NSArray越界为例,hook objectAtIndex方法,方法捕获越界异常,并在最后返回一个nil对象。...添加和删除时候做判断,同时hook dealloc函数,dealloc同时移除观察者和我观察对象。...移除未注册观察者:移除A对象观察者时,先判断数组是否有A对象观察者,如果有,再移除。

    2.1K20

    【DB笔试面试397】Oracle,以下工具可以实现逻辑备份数据库对象或整个数据库是哪一项()

    题目 Oracle,以下工具可以实现逻辑备份数据库对象或整个数据库是哪一项() A、SQL*Plus B、导出实用程序 C、导入实用程序 D、SQL*Loader A 答案 答案:...逻辑备份是指使用工具exp或expdp将数据库对象结构和数据导出到二进制文件过程。当数据库对象被误操作而损坏后就可以使用工具imp或impdp利用备份文件把数据对象导入到数据库中进行恢复。...逻辑备份是物理备份方式一种补充,多用于数据迁移。 显然,本题答案为B。...About Me:小麦苗 ● 本文作者:小麦苗,只专注于数据库技术,更注重技术运用 ● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/ ● 本系列题目来源于作者学习笔记

    78820

    Visual Studio 2019 (16.5) 查看托管线程正在等待锁被哪个线程占用

    功能入口 这个功能没有新入口,你可以“调用堆栈” (Call Stack) 窗口,“并行堆栈” (Parallel Stacks) 窗口,以及“线程”窗口位置列查看哪个托管线程正在持有 .NET...Call Stack 示例 现在我们就实际看一下这个功能用法和效果。于是写了一点下面的代码。...打开调用堆栈窗口(“调试 -> 窗口 -> 调用堆栈”),可以看到堆栈最顶端显示了正在等待锁,并且指出了线程对象。 ?...然后在线程窗口(“调试 -> 窗口 -> 线程“)位置列,鼠标移上去可以看到与堆栈相同信息。 ? 当然,我们主线程实际上早已直接退出了,所以正在等待锁将永远不会释放(除非进程退出)。...同样信息,并行堆栈“调试 -> 窗口 -> 并行堆栈”)也能看到。 ?

    2.1K10
    领券