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

在通用lisp (SBCL)中生成结构名称

在通用Lisp(特别是SBCL)中,生成结构名称通常涉及到使用defstruct宏来定义一个新的结构类型。结构是一种用户自定义的数据类型,它允许你将不同类型的数据项组合在一起。下面是一些基础概念和相关信息:

基础概念

  1. 结构(Structures):结构是一种复合数据类型,它可以包含多个字段,每个字段都有自己的名称和类型。
  2. defstruct宏:这是Lisp中用于定义结构的宏。它接受一个结构名称和一系列字段描述符。

相关优势

  • 组织性:结构提供了一种将相关数据项组织在一起的方式,使得代码更加清晰和易于维护。
  • 访问效率:直接通过字段名访问结构中的元素通常比通过列表或数组索引访问要快。
  • 类型安全:结构可以在编译时提供一定程度的类型检查。

类型

在Lisp中,结构的类型是由其名称决定的。例如,如果你定义了一个名为person的结构,那么它的类型就是person

应用场景

  • 表示复杂数据:当需要表示具有固定格式的复杂数据时,如坐标、日期、员工记录等。
  • 面向对象编程:虽然Lisp不是传统的面向对象语言,但结构可以用来模拟类和对象的行为。

示例代码

下面是一个使用SBCL定义结构的例子:

代码语言:txt
复制
(defstruct person
  (name "Unknown" :type string)
  (age 0 :type integer)
  (gender :unknown :type keyword))

;; 创建一个person实例
(defvar *john* (make-person :name "John Doe" :age 30 :gender :male))

;; 访问person实例的字段
(format t "Name: ~a, Age: ~d, Gender: ~a~%" (person-name *john*) (person-age *john*) (person-gender *john*))

遇到的问题及解决方法

问题:无法创建结构实例

原因:可能是由于拼写错误、结构定义不完整或字段类型不匹配。

解决方法

  • 检查结构定义中的拼写错误。
  • 确保所有必需的字段都已定义。
  • 验证传递给make-person的参数类型是否与结构定义中的:type选项匹配。

问题:字段访问出错

原因:可能是由于字段名称拼写错误或结构实例未正确初始化。

解决方法

  • 核对字段名称的拼写。
  • 确保使用make-person或其他构造函数正确创建了结构实例。

注意事项

  • 在定义结构时,可以使用:type选项来指定字段的类型,这有助于编译器进行优化和类型检查。
  • 可以使用:constructor选项来自定义构造函数的名称,以避免与默认的make-<struct-name>冲突。
  • 结构的字段可以是可选的或带有默认值,这提供了灵活性。

通过上述信息,你应该能够在SBCL中成功生成和使用结构名称。如果你遇到具体的编程问题,可以提供更详细的错误信息或代码片段,以便进一步诊断和解决。

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

相关·内容

Emacs 折腾记

我工作中倒并没有用得到 Lisp 的地方,但是最近眼前晃过的一些书,比如《计算机程序的构造和解释》、《码农》杂志第 13 期,都对这门古老的语言推崇备至,历数现代 Lisp 方言的先进性,再者我也一直有学习一门函数式编程语言的想法...在 ~/.emacs 文件里加上: M-x slime 就可以进入到 REPL 进行 Common Lisp 的学习了。...在 ~/.emacs 文件里添加: 这样自动补全之类的就没有问题了。 然后在如何运行当前 py 文件这件事上遇到些问题。在 Vim 中我一直是用 :!...配置这个倒是简单,安装 Markdown-mode 插件,然后在 ~/.emacs 中添加: (autoload 'markdown-mode "markdown-mode" "Major mode...在 ~/.emacs 文件中添加 这个 3 表示在距离屏幕上下边缘还有 3 行的时候再移动光标即自动滚屏,方便随时能看到当前编辑行的上下文,可以根据自己的使用习惯调整。

1.3K20
  • 【Groovy】自定义 Xml 生成器 BuilderSupport ( 继承 BuilderSupport 抽象类 | 在 createNode 方法中获取节点名称、节点属性、节点值信息 )

    文章目录 一、继承 BuilderSupport 抽象类 二、在 createNode 方法中获取节点名称、节点属性、节点值信息 三、完整代码示例 1、MyBuilderSupport 生成器代码 2...createNode 方法中获取节点名称、节点属性、节点值信息 ---- 在自定义的 MyBuilderSupport 类中 , 所有的创建节点的 createNode 方法都回调到 3 个参数的 createNode...protected Object createNode(Object name, Map attributes, Object value) { return null; } 因此 , 在该方法中..., 可以获取到节点的所有信息 , 包括 节点名称、节点属性、节点值信息 ; 在该方法中打印相关节点信息 : @Override protected Object createNode(...Groovy 脚本中 , 创建自定义 Xml 生成器 MyBuilderSupport 对象 , 并使用闭包描述要创建的 Xml 文件 ; // 创建自定义 Xml 构造器 def myBuilderSupport

    1.9K30

    NUS CS1101S:SICP JavaScript 描述:前言、序言和致谢

    设计一个能够描述任何计算的数据结构也只是稍微有些棘手。这本书的第 4 章中描述了这样的一个数据结构(表达式和语句的标记列表表示,配对环境将名称与值关联)和这样一个通用函数(apply)。...因此,虽然原则上我们可以只使用一个通用函数,但我们更喜欢将代码模块化,给各个部分命名,并提到函数描述的名称,而不是不断地将描述本身提供给通用函数。...也许最佳点更像是 40 个足够通用地在通用数据结构(如列表)上有用地操作的函数,但也有 10 组每组 6 个函数,当我们从 10 个专门的视角看待通用数据结构时是相关的。...Lisp 程序用功能膨胀的库,其效用超越了产生它们的应用程序。列表,Lisp 的本地数据结构,在很大程度上负责这种效用的增长。列表的简单结构和自然适用性反映在那些令人惊讶地非特异的函数中。...我们向在括号的巢穴中书写他的思想的 Lisp 程序员干杯。 —Alan J.

    19810

    用JavaScript实现一个编译器

    分词的原理:逐个读取源代码中的字符,与预设的关键词、字符串、数字、操作符等LISP语言定义的语法相关规则,转换成 {type: 'xx', value: 'xx'} 的具有描述意义的形式 例如LISP:...为什么要将其转换到AST,AST能更好的描述源代码的语义、描述结构更加通用,tokens列表只是描述了“符号”的意义,可以将词法分析过程看作是分类过程,而语法分析的过程,则是将符号组合,使其具有了执行顺序以及执行规则的语法...操作LISP得到的AST能更好转换到C语言的AST,因为他们的AST结构都是类似的,操作AST比tokens更容易。...,通过在AST上例如增、删、改属性,将传入AST转换为C语言需要的标准AST结构。...visitor对象实际可理解为转换规则,traverser函数在遍历AST结构时,会根据visitor中定义的规则执行转换,用于生成新的符合C语言描述标准的AST结构。

    95540

    《Spring Boot极简教程》附录3 编程简史附录3 编程简史名词纪要参考资料

    LISP,1958 名称取自"LISt Processor"(枚举处理器),约翰·麦卡锡(John McCarthy)在1958年基于λ演算所创造,采用抽象数据列表与递归作符号演算来衍生人工智能。...COBOL,1961 名称取自"COmmon Business Oriented Language"(通用商业导向语言),由格雷斯·霍波(G.Hopper)所开发。...1967-1978:确立基础范式 在1960年代以及1970年代中,结构化程序设计的优点也带来许多的争议,特别是在程序开发的过程中完全不使用GOTO。...Pascal语言语法严谨,层次分明,程序易写,具有很强的可读性,是第一个结构化的编程语言。Pascal的名称是为了纪念十七世纪法国著名哲学家和数学家Blaise Pascal。...日本以及其他地方运用了大量的资金对采用逻辑编程语言结构的第五代语言进行研究。函数编程语言社区则把焦点转移到标准化ML及Lisp身上。

    50420

    excel宏编程 c语言,宏(巨集)

    解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。...一个 C 宏可以定义一段语法的替换,然而一个 Lisp 的宏却可以控制一节代码的计算。 获得了控制代码的执行顺序(见惰性计算和非限制函数)的能力,使得新创建的语法结构与语言内建的语法结构不可区分。...这一限制可以通过用更强大的编程语言,如VBA来创建一个计算机程序在此弱编程语言里生成一个特别的宏来解决。...宏语言并未在通用编程中广泛使用,但在文本处理程序中应用普遍。...然而,这一特性在很多事务中受到欢迎。 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133568.html原文链接:https://javaforall.cn

    1.6K20

    Linux下MPI的安装与vscode的配置

    本文以MPICH为例,在ubantu中安装MPI的环境,并对vscode进行配置。.../yyy 3.2 vscode配置 使用code runner插件运行,进入插件设置页,然后点击 在settings.json中编辑,自动进入settings.json 文件 文件结构如下所示: 可以复制我的配置...此函数不必深究,只需在MPI程序开始时调用即可(必须保证程序中第一个调用的MPI函数是这个函数)。...在调用该函数时,需要先定义一个整型变量如myid,不需要赋值。将该变量传入函数中,会将该进程号存入myid变量中并返回。...在C和C++中,status的变量类型为MPI_Status,分别有三个域,可以通过status.MPI_SOURCE,status.MPI_TAG和status.MPI_ERROR的方式调用这三个信息

    11.1K20

    Lisp的本质(The Nature of Lisp)学习思考

    我们也知道, 它可以通过内存中的树结构来生成(GCC-XML做的就是这个事情)。它保存在不可执行的文件中。我们可以把它解析成树节点, 然后做任意的转换。显而易见, 它是数据。...但是在XML中我们可以轻而易举地做到。我们的解析器根据 XML元素, 生成抽象语法树, 由此生成算符, 所以, 我们可以任意引入任何算符。对于复杂的算符来说, 这样做的好处显而易见。...在Lisp中, 我们给表加一个前缀'来表示数据。...我们先提一个问题, 怎样写一个工具, 通过查找目录结构中的源文件来自动生成Ant脚本。 用字符串处理的方式生成Ant脚本是一种简单的方式。..., 意思是对表不求值, 但可以对表中某元素求值, 记号~表示对元素x求值, 这个求值记号在Common Lisp中应当是逗号。

    1.8K60

    深入浅出 Babel 下篇:既生 Plugin 何生 Macros

    另外 Lisp 支持数据和代码之间的转换 由于 Lisp 这种简单的语法结构,使得数据和程序之间只有一线之隔(quote修饰就是数据, 没有quote就是程序), 换句话说就是程序和数据之间可以灵活地转换...所以大部分宏实现会参考 Lisp 的S-表达式,取折中方案,将传入的程序转换为Tokens,再组装成类似quoted的数据结构。...除了数据结构的设计,现代编程语言的宏机制还包含以下特性: 1️⃣ 卫生宏(Hygiene) 卫生宏指的是在宏内生成的变量不会污染外部作用域,也就是说,在宏展开时,Sweet.js 会避免宏内定义的变量和外部冲突...上面列举的插件场景中,并不是所有插件都是通用的,它们要么是跟某一特定的框架绑定、要么用于处理特定的文件类型或数据。这些非通用的插件是最适合使用macro取代的。 用 preval 举个例子....形式调用,但是标签模板字符串中可能包含内插的字符串,例如: hello` hello world ${foo} + ${bar + baz} ` 其 AST 结构如下: ?

    1.5K31

    2017最受欢迎人工智能编程语言:Python第一,R并未上榜

    在JavaScript中,学习对话模型并不重要。学习服务器端的数据,然后通过Ajax调用学习者进行预测。...Prolog非常适合涉及结构化对象及其关系的问题。例如,在Prolog中,更容易表达对象之间的空间关系,比如表达“绿色的三角形在蓝色的后面”。...该语言在计算机科学中引入了许多想法,如递归,动态类型,高级函数,自动内存管理,自主(self hosting)编译器和树结构(tree data structure)。...此外,Lisp由一个宏系统,可以生成高效代码的开发良好的编译器,以及一组集合类型,包括哈希表和动态大小列表组成。...在Python中,几乎所有的想法都可以通过30-40行代码快速验证。

    2.4K60

    一文读懂基于 Yaegi 解释器开发可热插拔的 Traefik 插件

    2、语法分析(Parsing):在词法分析之后,Go 编译器会将标记序列转换为抽象语法树(AST)。抽象语法树是一种表示代码结构的数据结构,它可以更方便地进行代码分析和变换。...3、代码生成(Code Generation):在语法分析之后,Go 编译器会进行类型检查。类型检查器会检查变量、表达式和函数的类型是否一致,以及是否符合语言规范。...在类型检查之通过后,Go 编译器会将抽象语法树转换为目标机器代码。具体的代码生成过程会依赖于操作系统和编译器架构等因素。...下图说明了解释器如何工作的简单流程,具体如下所示: 与编译器一样,解释器也不是通用的,其设计目的是读取特定的输入格式。...它可以在应用程序中嵌入 Go 脚本,实现动态配置和扩展。此外,Yaegi 还支持在沙箱环境中运行代码,避免了潜在的安全风险。

    1.9K51

    讯飞星火Lite版永久免费;彩云科技发布全新通用模型结构DCFormer;谷歌将测试在人工智能概述中引入广告丨每日大事件

    大数据产业创新服务媒体 ——聚焦数据 · 改变商业 AI大模型 港中大深圳开展生成式音频大模型科研工作 5月21日消息,深圳市跨模态认知计算重点实验室、香港中文大学(深圳)趣丸科技联合实验室揭牌仪式在港中大...彩云科技发布全新通用模型结构DCFormer 5月22日消息,彩云科技发布了全新通用模型结构DCFormer,其相关论文《Improving Transformers with Dynamically...企业动态 谷歌将测试在人工智能概述中引入广告 5月22日消息,谷歌表示,将在美国开始测试在其人工智能生成的答案中出现搜索和购物广告,几天前谷歌在其年度I/O大会上推出了人工智能概览功能。...该公司在一篇博客文章中说,广告将根据查询的相关性和信息出现在人工智能概览的“赞助商”部分。谷歌一直在寻求将其主导地位从传统的搜索广告扩展到新兴的生成式人工智能技术。...谷歌的目标是通过在其搜索引擎中整合人工智能来提高广告额。该公司表示,将继续测试和学习新的广告形式,并从广告商那里获得反馈。

    1K10

    惊呆了,老外竟然用50中编程语言写“Hello,Word!”,我服了...

    在职业生涯中,所有程序员都至少完成过一段“Hello,World!" 程序。在成长中,程序员通常会使用多种编程语言,大部分程序员甚至实现过十几种”Hello,World!”版本。...STOP END 在 Fortran 90 或者 95 版本中,“Hello, World!”...Cobol 是 COmmon Business Oriented Language 的缩写,人们发明它是希望将其作为业务编程应用的通用语言。2019 年,Cobol 在银行业和保险业中仍然应用广泛。...它是为教学而设计的,其特点是语法清晰、严谨,有助于生成良好的程序结构。 begin writeln('Hello, World!') end....Python 支持结构化、函数式和面向对象的命令式编程。 这些年来, Python 变得非常流行,甚至在 2019 年成为最受欢迎的语言之一。

    80520

    唯品会亿级数据服务平台落地实践

    通用 Lisp 表达式 a 为函数名 后续字段为表达式元素 如 (func bar 1 2 3) 解析为 bar(1, 2, 3) 非聚合通用表达式 (func_none a b c ...)...通用 Lisp 表达式 a 为函数名 后续字段为表达式元素 如 (func_none bar 1 2 3) 解析为 bar(1, 2, 3) ,设置 Lisp 对象的 aggregation 属性为...语法树 通过自定义的 Listener 遍历语法树 在遍历语法树的过程中,结合指标的 query engine(presto/spark/clickhouse/mysql)元数据生成对应的查询引擎的 SQL...我们使用的方案不是直接写通过 ETL 任务写 Alluxio 表的数据,而是由 Alluxio 主动去拉取同样 Hive 表结构的 HDFS 中的数据,即我们创建了一个 HDFS 表的 Alluxio...人群计算采用业界通用的 ClickHouse BitMap 解决方案落地,提升人群的计算效率同时扩展数据服务的业务边界。 数据服务支持调度的 HA 和灾备完善,更好地在 K8s 上进行部署。

    84810

    唯品会亿级数据服务平台落地实践

    通用 Lisp 表达式 a 为函数名 后续字段为表达式元素 如 (func bar 1 2 3) 解析为 bar(1, 2, 3) 非聚合通用表达式 (func_none a b c ...)...通用 Lisp 表达式 a 为函数名 后续字段为表达式元素 如 (func_none bar 1 2 3) 解析为 bar(1, 2, 3) ,设置 Lisp 对象的 aggregation 属性为...语法树 通过自定义的 Listener 遍历语法树 在遍历语法树的过程中,结合指标的 query engine(presto/spark/clickhouse/mysql)元数据生成对应的查询引擎的 SQL...我们使用的方案不是直接写通过 ETL 任务写 Alluxio 表的数据,而是由 Alluxio 主动去拉取同样 Hive 表结构的 HDFS 中的数据,即我们创建了一个 HDFS 表的 Alluxio...人群计算采用业界通用的 ClickHouse BitMap 解决方案落地,提升人群的计算效率同时扩展数据服务的业务边界。 数据服务支持调度的 HA 和灾备完善,更好地在 K8s 上进行部署。

    83810

    《SICP》读书笔记之一:构造过程抽象(上)

    一种最基本的表达式就是数字,在 Lisp 中输入一个数,解释器将打印出该数字。...与其他语言相比,Lisp 的语法非常简单,其对表达式的求值可以描述为一个简单的通用规则加上一组针对特殊形式(不多)的专门规则。...一个约束定义的名称所对应的表达式集合称为该名称的作用域(scope),在过程定义中,被声明为该过程的形式参数的那些约束变量,以该过程体作为其作用域。 在 good-enough?...1.8.2 内部定义和块结构 平方根程序还说明了另一种对名称进行隔离的情况。...实际上,我们还可以对这一结构进行优化,注意到在子过程中,x 的定义是通用的,因此我们不需要再将其作为约束变量定义,再将其传入每个过程,而是直接将其设置为内部定义中的自由变量,如下所示: (define

    83420
    领券