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

lisp宏会计算它们的表达式吗,或者它们只是进行转换?

Lisp宏是Lisp编程语言的一个重要特性,它是一种代码生成工具,用于在编译时或运行时根据宏的定义来生成代码。宏可以将代码转换为其他形式,并且可以通过计算表达式来实现灵活的代码转换和生成。

当使用Lisp宏时,它们会在代码被编译或解释执行之前对它们的表达式进行计算和转换。这意味着宏可以对表达式进行操作,生成新的表达式,然后将其用作代码的一部分。

因此,可以说Lisp宏既会计算它们的表达式,也会进行转换。通过宏,开发者可以根据需要自定义代码的结构和行为,从而增加程序的灵活性和可扩展性。

下面是Lisp宏的一些特点和应用场景:

特点:

  1. 代码生成工具:宏可以将代码转换为其他形式,使开发者能够通过宏来自定义代码的生成过程。
  2. 在编译时或运行时执行:宏的计算和转换发生在代码被编译或解释执行之前。

应用场景:

  1. 代码重用:通过宏可以将常用的代码片段封装为宏,以便在多个地方复用。
  2. 领域特定语言(Domain-Specific Language,DSL):宏可以用于定义领域特定语言,使得开发者能够在特定领域中编写更加直观和高效的代码。
  3. 代码优化:宏可以用于自动优化代码,例如通过内联函数等方式提高程序的性能。
  4. 代码生成:宏可以用于生成复杂的代码结构,减少手动编写重复代码的工作量。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数(云原生应用开发):https://cloud.tencent.com/product/scf
  • 腾讯云数据库(数据库服务):https://cloud.tencent.com/product/cdb
  • 腾讯云服务器(云服务器):https://cloud.tencent.com/product/cvm
  • 腾讯云内容分发网络(CDN):https://cloud.tencent.com/product/cdn
  • 腾讯云人工智能(人工智能服务):https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么Lisp语言如此先进?(译文)

二、 1958年,John McCarthy设计了Lisp语言。我认为,当前最新潮编程语言,只是实现了他在1958年设想而已。 这怎么可能呢?计算机技术发展,不是日新月异?...复制变量就相当于复制指针,而不是复制它们指向数据。   5. 垃圾回收机制。   6. 程序由表达式(expression)组成。Lisp程序是一些表达式区块集合,每个表达式都返回一个值。...它与思想9只是由于偶然原因,才成为Lisp语言一部分,因为它们不属于John McCarthy原始构想,是由他学生Steve Russell自行添加。...Lisp无所不包,它既可能是某样表达式缩略形式,也可能是一种新语言编译器。如果你想真正地理解Lisp语言,或者想拓宽你编程视野,那么你必须学习。...你知道?上面的对比,还只是考虑到最好情况。当我们只比较代码数量时候,言下之意就是假设使用功能较弱语言,也能开发出同样软件。但是事实上,程序员使用某种语言能做到事情,是有极限

1.2K60

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

,如 Rust、Nim、Julia、Elixir,它们是如何解决技术问题, 实现类Lisp系统?...解释器或编译器在遇到时会自动进行这一模式转换,这个转换过程被称为“展开(Macro Expansion)”。对于编译语言,展开在编译时发生,进行展开工具常被称为展开器。...文本替换式很容易理解、实现也简单,因为它们只是纯文本替换, 换句话说它就像‘文本编辑器’。所以相对而言,这种形式能力有限,比如它不会检验语法是否合法, 使用它经常会出现问题。...Lisp灵活性得益于简单语法(S-表达式可以等价于它AST),对于复杂语法语言(例如Javascript),要实现类似Lisp就难得多....所以大部分实现参考 Lisp S-表达式,取折中方案,将传入程序转换为Tokens,再组装成类似quoted数据结构。

1.5K31
  • Clojure与LispClojure与Lisp

    但是,历史上也有对lisp进行诋毁的人,或许称为抱怨更为合适. lisp发展过程中,没有完整规范, 各种不兼容实现,陈旧落伍限制.cruft accumulate 在其存在四五十年里一直存在....自2000年起,LISP共享者合力支援自由开源社区逐渐形成,致力于LISP后续发展。 当前最新潮编程语言,只是实现了他在1958年设想而已。 这怎么可能呢?计算机技术发展,不是日新月异?...复制变量就相当于复制指针,而不是复制它们指向数据。 5 垃圾回收机制 6 程序由表达式(expression)组成 Lisp程序是一些表达式区块集合,每个表达式都返回一个值。...它与思想9只是由于偶然原因,才成为Lisp语言一部分,因为它们不属于John McCarthy原始构想,是由他学生Steve Russell自行添加。...Lisp无所不包,它既可能是某样表达式缩略形式,也可能是一种新语言编译器。如果你想真正地理解Lisp语言,或者想拓宽你编程视野,那么你必须学习

    1.9K30

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

    这两种表达方式转换, 非常自然, 也非常简单。s表达式打起字来, 也省事得多。第一次看s表达式(Lisp)时, 括号很烦人是吧? 现在我们明白了背后道理, 一下子就变得容易多了。...而且, Lisp没有语义约束, 你可以构造任何数据结构, 只要你原意。 Lisp通过(macro)来做元编程。我们写一组来把任务列表(to-do list)转换为专用领域语言。...可是, 既然我们用Lisp, 就根本没有必要再用XML格式保存数据, 直接用s表达式就好了, 这样就没有必要做转换了。我们也用不着专门解析库, Lisp可以直接在内存里处理s表达式。...如果我们用(+ 4 5)来代替arg1, 那么, 程序先求出结果, 就是9, 然后把9传递给函数。工作方式和函数类似。主要差别是, 参数在代入时不求值。...实际上, 编译器替我们工作, 调用相应。我们所要做, 仅仅是创建一个把数据转换为适当代码

    1.7K60

    Java之父接受Evrone专访:您需要软件可靠性越高,静态类型语言帮助就越大

    其他语言,如所有 Lisp 家族,设法更优雅地适应它们,但它们有一种定义语法方法,其中语法几乎完全没有语义。在大多数语言中,语法和语义是齐头并进。...某些语言允许您以不同方式执行此操作,因此就像在 Groovy 中一样,您可以直接使用 AST。Rust 有某种语法集成。但我总觉得里面有一个有趣研究问题:你能做更多?...我能体会到 Lisp 对代码片段进行计算以生成新代码感觉?在 Java 世界中,人们这样做。这是比较流行功能之一,只是级别非常低。...很久以前,我参加了其中一门课程,我在每项作业中都使用了绝对最差语言。在 Cobol 中进行数值计算。那只是有趣!和 Fortran 中符号操作......令人惊讶是,我仍然得到了 A。...如果你称它们为“类型案例”——好主意。但是如果你称它为“模式匹配”,而且它威力比正则表达式要小,那感觉它是误导性或者像虚假广告。但是,作为一个功能,我认为它很棒。

    58530

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

    编译器和解释器都是将高级语言源代码转换为机器级语言程序工具,但是它们工作方式有所不同。 那么,什么是编译器?...它本质上是一个计算机程序,用于将用编程语言编写代码或指令转换为机器代码,即由0和1组成二进制语言,这是计算机处理器可以理解语言。...3、代码生成(Code Generation):在语法分析之后,Go 编译器进行类型检查。类型检查器检查变量、表达式和函数类型是否一致,以及是否符合语言规范。...它支持动态类型、高阶函数、闭包、扩展等 Lisp 特性,并能够直接调用 Go 语言函数和方法。...6、Golo:Golo 是一个基于 Go 语言实现 Lisp 解释器。它支持大多数 Lisp 特性,包括扩展和动态类型。

    1.8K51

    不管是嵌套 XML,还是 Lisp 嵌套括号,还是 XXX Map 数据结构,一切都是树形结构——映射。Lisp本质(The Natur

    我们在把XML转换成s表达式 时候, 心里应该记住这一点。看个例子, 上面的代码译成s表达式是这样: (copy (todir ".....而且, Lisp没有语义约束, 你可以构造 任何数据结构, 只要你原意。 Lisp通过(macro)来做元编程。我们写一组来把任务列表(to-do list)转换为专用领 域语言。...可是, 既然我们用 Lisp, 就根本没有必要再用XML格式保存数据, 直接用s表达式就好了, 这样就没有必要做 转换了。我们也用不着专门解析库, Lisp可以直接在内存里处理s表达式。...如果我们用(+ 4 5)来代替arg1, 那么, 程序先求出结果, 就是9, 然后把9传递给函数。工作方式和函数类似。主要 差别是, 参数在代入时不求值。...实际上, 编译器替我们工作, 调用相应。我们所要做, 仅仅是创建一个把数据转换为适当代码

    1.4K20

    excel编程 c语言,(巨集)

    解释器或编译器在遇到时会自动进行这一模式替换。对于编译语言,展开在编译时发生,进行展开工具常被称为展开器。...这一术语也常常被用于许多类似的环境中,它们是源自展开概念,这包括键盘语言。绝大多数情况下,“”这个词使用暗示着将小命令或动作转化为一系列指令。...用途在于自动化频繁使用序列或者是获得一种更强大抽象能力——但这常常是一回事。 计算机语言如C语言或汇编语言有简单系统,由编译器或汇编器预处理器实现。...C语言预处理器工作只是简单文本搜索和替换,使用附加文本处理语言如M4,C 程序员可以获得更精巧。...一个 C 可以定义一段语法替换,然而一个 Lisp 却可以控制一节代码计算。 获得了控制代码执行顺序(见惰性计算和非限制函数)能力,使得新创建语法结构与语言内建语法结构不可区分。

    1.6K20

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

    设计一个能够描述任何计算数据结构也只是稍微有些棘手。这本书第 4 章中描述了这样一个数据结构(表达式和语句标记列表表示,配对环境将名称与值关联)和这样一个通用函数(apply)。...在这本书中,“程序”使用集中在使用 Lisp 方言编写、在数字计算机上执行程序创建、执行和研究上。使用 Lisp,我们限制或限定不是我们可以编程内容,而只是我们程序描述符号。...将我们 Lisp 程序转换为“机器”程序过程本身就是我们编程抽象模型。它们研究和创建为我们提供了对与编程任意模型相关组织程序深刻洞察。当然,计算机本身也可以被建模。...然而,转换到 JavaScript 迫使我们对第 4 和 5 章解释器和编译器进行微妙更改,以处理返回语句。Scheme 表达式导向语法没有返回语句,而返回语句是面向语句语言一个显著特征。...这是 Lisp 类语言一个巨大优势:它们几乎没有形成复合表达式方式,几乎没有语法结构。所有的形式属性都可以在一个小时内覆盖,就像国际象棋规则一样。

    18010

    第6章 | 表达式 | 优先级,块与分号,生命,if match

    LISP 程序员知道一切价值(value),但不了解其代价。 ——Alan Perlis 本章将介绍 Rust 表达式,它是函数体组成部分,因而也是大部分 Rust 代码组成部分。...6.1 表达式语言 Rust 乍看起来和 C 家族语言相似,但这只是假象。...这意味着它遵循更古老传统,可以追溯到 Lisp,在 Lisp 中,表达式能完成所有工作。 在 C 中,if 和 switch 是语句,它们不生成值,也不能在表达式中间使用。...block_n } 每个 condition 都必须是 bool 类型表达式,依照 Rust 风格,不会隐式地将数值或指针转换为布尔值。...它会永远重复执行循环体(直到遇上 break 或 return,或者直到线程崩溃)。 for 循环会对可迭代(iterable)表达式求值,然后为结果迭代器中每个值运行一次循环体。

    10910

    Clojure 开发那些事

    其实也好理解,Lisp 语言诞生这么久了,为什么一直那么小众?原因就在于 Lisp 语言过于强大,不必也不可能像 Java 那么普及。你能要求每个人都能为 CTO ?...语法入门 括号 Lisp 语法最显著特点是“括号多”,不过这只是其外在表现,内在表现是阅读代码方式,需要从最里面的表达式开始,比如: ;; Clojure > (split (upper-case...,这里我们不必对某个编辑器有过多偏见,它们都是生产力工具而已,写好代码才是重要。...Intellj Debug Mode 借助于 IDE 优势,我们可以打断点,一步一步调试,但是 Cursive 对支持比较有限,目前出来把展开外,没找到好调试好方法。...大部分都是一些简单语法介绍或者概念阐述,我希望能够弥补这一块,把自己使用 Clojure 开发经历分享出来,供以后同学参考。

    1.6K20

    (译) Understanding Elixir Macros, Part 1 Basics

    其主要思想就是我们可以编写一些代码, 它们根据某些输入来生成代码....AST1 以嵌套 Elixir Terms 形式来表述你代码. 然后进入展开阶段. 在这个阶段, 各种内置和自定义转换成了最终版本....一旦转换结束, Elixir 就可以生成最后字节码, 即源程序二进制表示. 这只是对整个编译过程概述....(要么是 string, 或者是一个 AST 片段) 理解这一点很重要: unquote 并不是 quote 反向过程. quote 将一段代码转换成 quoted 表达式 (quoted expression...然后返回表达式结果. 需要认识到这是一个, 它输入(1+2)可以被转换成更复杂形式 — 打印表达式结果并返回它. 这个变换会发生在展开阶段, 产生字节码为输入代码经过修饰版本.

    18630

    编程语言出现都这么随意

    1960 年 Lisp 并没有来得及设计自己语法,就被麦卡锡学生实现了,因为没有语法,麦卡锡学生就以列表格式语法分析树(即,S(Symbolic)表达式)作为临时语法。...麦卡锡希望 Lisp 语法是数学表达式元语言,命名为 M(Mate)表达式,类似于后面的 ML 语言语法。...但是这种想法遭到了当时 Lisp 程序员反对,最后麦卡锡开了 MIT,从此 Lisp 语法凝固在 S 表达式上。 Lisp 建立在列表和 lambda 演算和基础上,是函数式编程鼻祖。...随着 Fortran 诞生,其他一些语言也在开发中,这些语言语法格式各不相同,而且和 Fortran 一样,都与运行它们具体计算机关联(比如标示符长度、代码行数限制等)。...; 表面上你在定义变量和赋值,其实只是对; 表面上你声明函数,其实只是对。

    1.6K60

    盘点丨入门必读 机器学习六大开发语言

    下面,我们来看看六大主流机器学习语言——R 语言、MATLAB、Python、Java 、C/C++ 和 Lisp。 R 语言 R 是一个专门设计来进行数据计算语言工具。...相比之下,Octave 是 MATLAB 一个免费替代品,它们十分相似,有几乎相同语法。只是 Octave 工具箱更少一些,IDE 也不如 MATLAB 成熟。...在嵌入式系统例子中,比如智能设备、汽车和传感器,使用 C 或者 C++ 语言可能是必需。若现有平台基础或特定应用已使用了 C/C++,使用它们更方便。...它一些属性,比如快速原型设计和方便”使用(macro utility),在 AI 开发中十分有用。编写复杂程序使用 Lisp 相对容易。它是一个能用简单方式创造强大算法语言。...对于把学习方案扩展到对海量数据处理,以及用不同模型进行快速测试,它们向客户提供了解决方案。只要你有坚实机器学习基础,使用新产品或者新平台就相当于学习怎么使用一个新工具。

    1.1K80

    如何编写高质量 JS 函数(3) --函数式编程

    在 ENAIC 诞生后,出现了各种各样 程序设计语言。三大美德也提现淋漓尽致。 九、计算机语言分类 上图可以获得以下信息: 程序设计语言只是计算机语言一个分类。...你可能疑问,既然硬件不支持,那我们为什么还能进行函数式编程? 其实现实中,大多数人都是用冯诺依曼体系命令式语言。所以为了获得特别的计算能力和编程特性。...举个例子:比如将 TS 转换成 JS 过程中,如果表达式具备引用透明性。那么在编译时候,就可以提前把表达式结果算出来,然后直接变成值,在 JS 运行时候,执行时间就会降低。...你会发现只能用递归实现循环、没有 try catch 等要求,是合理且合适。 PS: 这就好像是一直使用函数式语言的人突然接触命令式语言,也满头雾水。 七、函数式编程不允许使用可变状态?...因为语句本质是:在于描述表达式求值逻辑,或者辅助表达式求值。

    1.7K00

    《代码英雄》第三季(7):与机器对话

    然后在接下来几年里,LISP 作为他想法实现,或者说实现他想法语言出现了。 00:04:39 - Saron Yitbarek: 麦卡锡 LISP 语言改变了游戏规则。...实际上,LISP 有一堆重大编程突破,条件表达式、垃圾回收、递归等等。LISP 在代码和数据中都使用了列表。这是一个简单但具有深远影响更改。...因为我下一个问题是 LISP 和人工智能之间关系。接受建议者第一次描述了 AI 功能,它听起来也像是 LISP 开始。能跟我聊聊更多 LISP 和人工智能之间关系?...即使没有这些人将计算力分流走,它们也是真正低能力机器,其性能不足以在支持 LISP 系统必要功能同时,运行一套机能齐全用户界面。...LISP 不是那样设计。它被设计为仅在人工干预基础上发展。然而,对于现在机器学习算法而言,其中学习部分意味着它们根据所接触数据进行自我调整。

    27330

    --03:控制流

    在纯函数式语言中是没有副作用,好比我们学那些数学方程式,你给你一个特定参数,这个方程式只是依赖或不依赖其外围引用环境,如果这一刻它计算结果是2,那么任何时刻都是2,一个有趣术语叫引用透明,用来描述纯函数式中表达式特性...这个阶段引入了子程序(函数),子程序主要对代码进行复用,不是有句话是说程序=数据结构+算法,其中这个算法也就是子程序,数据结构则是对零散数据一种组织方式。...在Common Lisp中,程序员可以选择返回第一个、第二个或者最后一个元素值。当然,除非那些不提供返回值表达式有副作用,否则这种复合语句在纯函数式编程语言中是没有任何作用。...在Lisp中,各种顺序结构只是被用在哪些不符合纯函数式程序设计模型代码片段中。...基于上面提出四个问题,我们有如下疑问: 循环里可以修改i、first或者last?如果可以,这种修改对循环有何影响?

    2K100

    可爱 Python:Python 中函数编程

    在很纯粹情况下,一个程序就是一个表达式(加上支持定义)。 FP 关心计算什么而不是如何计算。...一个函数只是我们在 Python 中对其执行某些操作另一个值。  我们对第一类对象所执行主要操作是将它们传递给 FP 内置函数 map()、reduce() 和 filter()。...通过将这三种 FP 内置函数进行组合,可以执行惊人一系列“流”操作(都不使用语句,而只使用表达式)。  Python 中函数循环替换循环与替换条件块一样简单。for 可以直接转换成 map()。...第一类函数另一个方便特性就是可以将它们放在一个列表中。  while 转换稍微复杂了一些,但仍然可以直接进行:  清单 5....对特定程序进行有效转换将带来一些额外考虑,但我们已经知道内置函数是常规而完整。在稍后专栏中,我们将考虑一些更高级函数编程技术;希望能够探索函数风格更多利弊。

    91120

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

    在正常工作计算机里,一个计算过程将精密而准确地执行相应程序。 为了描述计算过程,我们需要一种合适语言,本书中将使用 Lisp。...这种运作模式被称为 read-eval-print-loop (REPL),注意并不需要显示地要求解释器打印表达式值,解释器自动打印。...它可以被理解为确定过程应用“意义”一种模型,这里有两点需要强调: 代换目的只是为了帮助我们领会过程应用,并不是对解释器实际工作方式描述 在之后章节中,我们介绍一系列有关解释器如何工作复杂模型...Lisp 使用应用序求值,主要有两点原因: 避免对于表达式重复求值,提高效率 在超出代换模型可以模拟范围后,正则序求值将变得非常复杂 而另一方面,正则序求值也可以成为特别有价值工具,将在之后进行介绍...1.6 条件表达式和谓词 目前为止我们定义出过程类表达能力还非常有限,还没有办法去进行某些检测,然后根据检测结果进行不同操作。

    81820

    Clojure 学习入门(18)—— 数据类型

    ---- 在涉及到不同类型数字运算时,Clojure自动将结果转换到最精确类型。例如,当整数和浮点数相乘时,结果将是浮点数。...除法运算总是返回一个比率,除非其中一项是个十进制数,结果会被转换成浮点数。 数字没有最大值限制。Clojure自动转换为最合适内部表示形式来表示越来越大数字,处理任何数字都没有问题。...注释 为保持简单,Clojure API中计算函数与其他语言常见运算是一致。但不用担心:当表达式被解析和编译时,它们会被替换为优化Java字节码,尽可能使用原始运算。...(re-pattern " [a-zA-Z]*") -> #"[a-zA-Z]*" 也可以使用读取来直接用文本方式输入正则表达式:在字符串前使用#符号。...(1 2 3)和(quoto (1 2 3))只是表示相同事物不同方法而已。quote(或者单引号)可以在任何地方使用,来阻止Clojure立即对一个表达式求值。

    2.3K10
    领券