Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >这些宏之间有什么区别?

这些宏之间有什么区别?
EN

Stack Overflow用户
提问于 2018-01-08 10:57:34
回答 1查看 125关注 0票数 3

我有一些关于如何在Scheme中运行宏的问题(特别是在鸡肉方案中),让我们考虑下面的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(define (when-a condition . body)
  (eval `(if ,condition
     (begin ,@body)
     '())))

(define-syntax when-b
  (er-macro-transformer
    (lambda (exp rename compare)
      (let ((condition (cadr exp))
            (body (cddr exp)))
        `(if ,condition (begin ,@body) '())))))

(define-syntax when-c
  (ir-macro-transformer
    (lambda (exp inject compare)
      (let ((condition (cadr exp))
            (body (cddr exp)))
        `(if ,condition (begin ,@body) '())))))

(define-syntax when-d
  (syntax-rules ()
    ((when condition body ...)
     (if condition (begin body ...) '()))))
  1. 我可以认为when-a是一个宏吗?我觉得我不能严格地把它看作是一个宏,因为我没有使用define-syntax,但是我无法说出不喜欢这个实现的任何实际原因。
  2. 我的宏卫生吗?
  3. when-bwhen-c有什么区别吗?由于我没有使用renameinject,所以我认为没有。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-08 12:27:11

我能考虑一下什么时候-一个宏吗?我觉得我不能严格地把它看作一个宏,因为我没有使用定义语法,但是我不能说出任何实际的理由不喜欢这个实现。

这类似于宏,但与真正的宏不完全相同,原因如下:

  • 真正的宏和基于eval的“宏”之间的主要区别是,在调用之前,您的方法将评估它的所有参数--。这是一个非常重要的区别。例如:(if #f (error "oops") '())将计算为'(),但(when-a #f (error "oops"))将引发一个错误。
  • 这不卫生。例如,在此之前,人们可能会做一些类似于(eval '(define if "not a procedure"))的事情,这意味着这一评估将失败;在“展开”的体表达式中的if并不是指定义站点上的if
  • 它不会在编译时被展开。这是使用宏的另一个主要原因;编译器将展开宏,并且在运行时不会执行任何计算来执行扩展。宏本身将完全蒸发。只剩下扩张了。

我的宏卫生吗?

只有when-cwhen-d是这样,因为ir-macro-transformersyntax-rules提供了保证。在when-b中,您必须重命名ifbegin,才能使它们引用宏定义站点上的ifbegin版本。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(let ((if #f))
  (when-b #t (print "Yeah, ok")))

== expands to ==>

(let ((if1 #f))
  (if1 #t (begin1 (print "Yeah, ok"))))

这将失败,因为两个版本的if (这里有一个额外的1后缀注释)引用的是相同的东西,所以我们将以操作符的位置调用#f

相比之下,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(let ((if #f))
  (when-c #t (print "Yeah, ok")))

== expands to ==>

(let ((if1 #f))
  (if2 #t (begin1 (print "Yeah, ok"))))

它将按预期工作。如果您想重写when-b以保持卫生,请这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(define-syntax when-b
  (er-macro-transformer
    (lambda (exp rename compare)
      (let ((condition (cadr exp))
            (body (cddr exp))
            (%if (rename 'if))
            (%begin (rename 'begin)))
        `(,%if ,condition (,%begin ,@body) '())))))

注意额外的%-prefixed标识符,它引用了ifbegin的原始值,因为它们位于宏的定义位置。

时间-b和时间-c之间有什么区别吗?因为我不使用重命名或注入,所以我认为没有。

的确有。隐式重命名宏之所以被调用,是因为它们隐式地重命名了来自使用站点的所有标识符,以及您在正文中引入的每个新标识符。如果注入任何标识符,则取消此隐式重命名,这使得调用代码从卫生角度上可以捕获这些标识符。

另一方面,调用显式重命名宏是因为您必须显式重命名任何标识符,以防止调用代码捕获它们。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48156478

复制
相关文章
解读 | IaaS、PaaS和SaaS之间有什么区别?
随着时间的推移,云计算技术对于组织来说变得越来越重要。在大量的应用程序运行在不同的云模型时,组织需要做一些工作来检查这些解决方案是否更能满足其需求。组织需要确定其投资组合中的每个应用程序都在为自己和最终用户而使用正确的云模型。
CloudBest
2020/09/30
1.8K0
解读 | IaaS、PaaS和SaaS之间有什么区别?
SFTP是什么?与FTP之间有什么区别
SFTP是一种安全的文件传输协议,一种通过网络传输文件的安全方法;它确保使用私有和安全的数据流来安全地传输数据。
lyb-geek
2019/09/16
7.4K0
SFTP是什么?与FTP之间有什么区别
深度好文:QinQ 、VLAN、VXLAN之间有什么区别?
VLAN 是一种将网络划分为多个广播域的技术。在每个广播域中,用户之间可以自由交流。对于不同 VLAN 之间的连接,VLAN Tagging 和 VLAN 间路由是用户必须知道的两个必要术语。
网络技术联盟站
2023/03/13
1.7K0
深度好文:QinQ 、VLAN、VXLAN之间有什么区别?
防火墙、IDS、IPS之间有什么区别?
1、基础防火墙类:主要是可实现基本包过滤策略的防火墙,这类是有硬件处理、软件处理等,其主要功能实现是限制对IP:port的访问。基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。
网络安全观
2021/02/25
5.4K0
防火墙、IDS、IPS之间有什么区别?
c++和c语言之间有什么区别
  C语言是一种古老而又经久不衰的计算机程序设计语言,大约诞生于上个世纪60年代。由于它的设计有很多优点,多年以来深受广大程序设计人员的喜爱,并逐渐 淘汰了很多其它程序设计语言。我们平时使用的大多数软件都是用C语言开发的。
诸葛青云
2019/11/11
2.3K0
c++和c语言之间有什么区别
面试官:BIO、NIO、AIO之间有什么区别?
在讲解 BIO、NIO、AIO 之前,我们先来回顾一下这几个概念:同步与异步,阻塞与非阻塞。
Java极客技术
2023/09/14
1.5K0
面试官:BIO、NIO、AIO之间有什么区别?
React篇(039)-Shadow DOM 和 Virtual DOM 之间有什么区别?
Shadow DOM 是一种浏览器技术,它解决了构建网络应用的脆弱性问题。Shadow DOM 修复了 CSS 和 DOM。它在网络平台中引入作用域样式。无需工具或命名约定,你即可使用原生 JavaScript 捆绑 CSS 和标记、隐藏实现详情以及编写独立的组件。Virtual DOM 是一个由 JavaScript 库在浏览器 API 之上实现的概念。
齐丶先丶森
2022/05/12
4310
什么是Hypervisor?Type 1 和Type 2 之间有什么区别?
在了解 Type 1 和 Type 2 Hypervisor 之间的区别以及哪个更好之前,让我们先看看 Hypervisor 是什么?
网络技术联盟站
2021/11/19
6.1K0
什么是Hypervisor?Type  1 和Type  2 之间有什么区别?
JPG 与 JPEG:这些图像文件格式有什么区别?
◆ 概述 JPG 和 JPEG 是一样的吗?还是完全不同的东西?并非所有图像文件格式都是一样的。事实上,它们中的许多都是为了解决现有格式无法解决的问题而创建的。例如,JPEG 的出现是因为图像文件的大小占用了太多的存储空间。信不信由你,JIF、JPEG 和 JPG 文件扩展名或多或少指的是同一件事。要理解为什么文件格式有这么多名字,我们需要解开一些错综复杂的历史。 ◆ 什么是 JPEG? JPEG 首字母缩略词代表联合图像专家组——文件类型以帮助创建 JPEG 交换格式 (JIF) 标准的小组委员会命名。它
IT大咖说
2022/03/14
8.4K1
经典面试题-Spring Bean的作用域之间有什么区别?
Spring容器中的bean可以分为5个范围。所有范围的名称都是自说明的,但是为了避免混淆,还是让我们来解释一下:
cwl_java
2019/11/05
1.1K0
VRRP、VGMP 和 HRP 之间有什么区别?这篇文章给你答案!
作为USG防火墙最重要的功能之一,双机热备极大地提高了设备的可靠性,当主用设备发生故障时,备用设备可以立即接管受影响的业务,从而显着减少业务中断的持续时间。
网络技术联盟站
2022/05/20
1.5K0
VRRP、VGMP 和 HRP 之间有什么区别?这篇文章给你答案!
测试数据集与验证数据集之间有什么区别呢?
验证数据集(Validation Datasets)是训练模型时所保留的数据样本,我们在调整模型超参数时,需要根据它来对模型的能力进行评估。
StoneDemo
2018/02/02
5.8K0
测试数据集与验证数据集之间有什么区别呢?
云计算、大数据和物联网之间,有什么区别和联系?[通俗易懂]
随着大数据概念的提出,云计算中的分布式计算技术开始更多地被列入大数据技术,而人们提到云计算时,更多指的是底层基础IT资源的整合优化以及以服务的方式提供IT资源的商业模(如Iaas、PaaS、SaaS)。
全栈程序员站长
2022/11/08
8490
总结if/elif/else/endif宏之间的嵌套关系
先前写的一个工具(Qml宏预处理工具)顺便就总结一下if/elif/else/endif之间的嵌套关系,并整理成表。   从左到右顺序,与之上一个宏定义对比。除去2个无效项,共有14个有效项。 if elif else endif if 创建子层 同层逻辑 同层逻辑 同层逻辑 elif 创建子层 同层逻辑 同层逻辑 同层逻辑 else 创建子层 无效 无效 同层逻辑 endif 创建分组层 上一层逻辑 上一层逻辑 上一层逻辑   示例标注: #if #if /* if -> if 创建子层 */
Qt君
2019/11/14
1.3K0
什么是坐标系,不同坐标系之间有什么区别
本文作者为国外制图师希瑟·史密斯,由点点GIS翻译发布,如有错漏之处请后台留言指出
陈南GISer
2021/08/18
1.8K0
什么是坐标系,不同坐标系之间有什么区别
IPS vs IDS vs Firewall vs WAF,它们之间有什么区别与联系?
为了快速了解如何在网络设计中使用这些解决方案/设备,让我们看一下下面的拓扑,其中包括网络中的所有安全解决方案(防火墙、IPS、IDS、WAF)。
网络技术联盟站
2023/03/13
2.9K0
IPS vs IDS vs Firewall vs WAF,它们之间有什么区别与联系?
java 中操作字符串都有哪些类?它们之间有什么区别?
一般来说,如果在单线程环境下进行字符串操作,并且不需要频繁修改字符串,可以使用String类。如果需要频繁修改字符串或在多线程环境下进行字符串操作,可以选择StringBuilder或StringBuffer类,具体选择哪个取决于是否需要线程安全性。
高久峰
2023/07/14
3670
人工智能、机器学习、统计学、数据挖掘之间有什么区别?
人工智能、机器学习、统计学和数据挖掘有什么区别? 是否可以这样说,它们是利用不同方法解决相似问题的四个领域?它们之间到底有什么共同点和不同点?如果它们之间有层次等级的区分,应该是怎样一回事? 我假定题主是想得到一个清晰的图,上面有各个领域清晰的分界线。因此,在这里我尝试用我最简单的方式来解释这个问题。 机器学习是一门涉及自学习算法发展的科学。这类算法本质上是通用的,可以应用到众多相关问题的领域。 数据挖掘是一类实用的应用算法(大多是机器学习算法),利用各个领域产出的数据来解决各个领域相关的问题。 统计学是一
用户1410343
2018/03/27
1.6K0
人工智能、机器学习、统计学、数据挖掘之间有什么区别?
IPTV、互联网电视、网络电视、智能电视,这些概念有什么区别?
这是知乎上的一个问题,碰巧被纳入了“知乎日报”。我在2012年的回答获得了最多的“点赞”。这里分享给大家臭美一下。 原问题是: “云电视、网络电视和智能电视这些概念有什么区别?”。 维基百科对这些概念的定义: IPTV(网路协定电视,英文:Internet Protocol Television),是宽频电视的一种。IPTV是用宽频网络作为介质传送电视信息的一种系统,将广播节目透过宽频上的网际协议向订户传递数码电视服务。由于需要使用网路,IPTV 服务供应商经常会一并提供连接互联网及IP电话等相关服
罗超频道
2018/04/28
2.8K0
点击加载更多

相似问题

这些陈述之间有什么区别?

34

这些函数之间有什么区别?

31

这些方法之间有什么区别?

22

这些文件之间有什么区别?

13

这些代码之间有什么区别?

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文