当前位置: 首页 > news >正文

宏编程:C++宏、Rust宏和Lisp宏比较

根据simondobson两篇文章(1、2),总结比较一下C++宏 Rust宏和Lisp宏:

Rust 宏:Rust 有两种类型的宏:

  • 声明性宏:这些模式匹配参数来生成代码。

  • 过程宏:这些宏执行从代码到代码的更一般的转换。

Lisp 宏:

  • Lisp 具有一种宏,它也可以从一个代码操作到另一个代码,利用其同像性,其中代码和数据共享相同的结构。

C++宏:

  • 预处理器宏: 基于文本替换,简单但容易引发错误。
  • 模板: 用于编译时元编程,通过类型参数进行代码生成,虽然功能强大,但会导致复杂的错误信息和较长的编译时间。

功能和复杂性

  • C++宏:
    • 预处理器宏功能有限,容易出错。
    • 模板功能强大,但复杂,需要理解模板特化和SFINAE(替换失败不是错误),增加开发难度。
  • Rust宏:
    • 声明式宏和过程宏都很强大,但过程宏需要理解令牌流,增加了编写宏的难度
    • 过程宏在使用上更加复杂,需要更多的语法和编译过程知识。
  • Lisp宏:
    • 功能强大,直接操作代码作为数据,利用同像性简化宏的创建。Lisp 宏只需要了解 Lisp 本身,而不需要了解其内部结构,并且可以对代码参数的整个详细结构进行操作。这是同像性威力的一个显著例子。
    • 由于代码和数据共享相同的结构,宏的创建和使用更为直接和简单。

与C++宏相比:

  • Lisp(当然还有 Rust)宏可以抽象语法以及类和值,因此允许使用新的编译时一流结构来扩展语言。

设计哲学

  • C++:
    • 设计相对严格,模板元编程虽然强大,但代码可读性较差,语法复杂。
  • Rust:
    • 宏是语言的扩展,核心功能并不依赖于宏。尽管强大,但使用起来比较繁琐。
  • Lisp:
    • 设计强调简单和灵活性,宏是语言的核心功能,甚至基本操作如defun都是宏。代码更容易阅读和维护。

总结:
模板仅限于实例化用固定语法编写的模板;

  • 在 Lisp 中,语法必须是“Lisp 式的”,尽管这是一个非常轻微的限制;
  • 而在 Rust 中,宏可以使用 Rust 可以标记的任何语法。

虽然 C++ 模板有时被描述为宏编程(或元编程),但它们处理的用例与 Lisp 或 Rust 宏处理的用例有很大不同,并且在更受限制的计算和语法范围内进行。

Rust宏与Lisp宏这两种语言方法的主要区别在于宏是Rust 的附加功能,但Lisp 是固有功能defun

  • Rust 的核心都不使用宏:它们用于扩展。

  • Lisp 中常见操作实际上也是扩展到更简单核心操作的宏。

这或许解释了 Rust 设计者决定使宏在语法上有所不同。

C++宏、Rust宏和Lisp宏各有优劣:

  • C++宏提供了基本的文本替换功能,但其模板系统尽管强大,却复杂且难以调试。

  • Rust宏在功能上更强大,提供了声明式和过程宏,但需要更深的语言和编译过程理解,增加了编写和使用的复杂性。

  • Lisp宏由于其同像性,允许直接操作代码作为数据,宏的创建和使用最为简单和强大,整体设计更为灵活。

综上所述,Lisp的宏系统在功能和易用性方面通常更具优势,C++和Rust的宏系统在特定场景下也各有独特的优势和应用。

更多元编程:https://www.jdon.com/74818.html

相关文章:

宏编程:C++宏、Rust宏和Lisp宏比较

根据simondobson两篇文章(1、2),总结比较一下C宏 Rust宏和Lisp宏: Rust 宏:Rust 有两种类型的宏: 声明性宏:这些模式匹配参数来生成代码。 过程宏:这些宏执行从代码到代码的更一般…...

ChatGPT协助撰写研究论文的11种方法【全集】

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 当我们使用 ChatGPT 时,原本那些需要花费数小时、数天、有时甚至更长时间的任务现在只需几分钟甚至更短时间。 今天的分享,我们将谈谈 ChatGPT 在研究论文方面可…...

PEP 8 – Python 代码风格指南中文版(四)

何时使用尾随逗号 尾随逗号通常是可选的,但在创建一个只有一个元素的元组时是必须的。为了清晰起见,建议使用(技术上多余的)括号将其包围起来: # 正确的: FILES (setup.cfg,)# 错误的: FILES setup.cfg, 当尾随逗号…...

基于深度学习的适应硬件的神经网络

基于深度学习的适应硬件的神经网络设计旨在最大限度地利用特定硬件平台的计算和存储能力,提高模型的执行效率和性能。这些硬件包括图形处理单元(GPU)、张量处理单元(TPU)、现场可编程门阵列(FPGA&#xff0…...

上传音频文件

思路 1、自定义Upload 重点&#xff1a;<input ref{inputRef} type"file" accept{accept} onClick{e > e.stopPropagation()} onChange{uploadFile} multiple{multiple}/> 使用input标签设置type是file&#xff0c;将input元素通过forwardRef暴露给父组件&…...

Linux之jdk离线安装

下载地址 一、linux安装jdk8 1、上传&#xff0c;解压 cd /usr/local/java tar -zxvf jdk-10.0.2_linux-x64_bin.tar.gz2、修改配置 vim /etc/profile #在/etc/profile文件后面加上如下配置 export JAVA_HOME/usr/local/java/jdk-10.0.2 export JRE_HOME/usr/local/java/jd…...

JVM结构、架构与生命周期总结

【1】JVM结构 不同厂商的JVM产品 &#xff1a; 厂商JVMOracle-SUNHotspotOracleJRocketIBMJ9 JVM阿里Taobao JVM HotSpot VM是目前市面上高性能虚拟机的代表作之一。它采用解释器与即时编译器并存的架构。 在今天&#xff0c;Java程序的运行性能早已脱胎换骨&#xff0c;已…...

Flink-StarRocks详解:第四部分StarRocks分区管理,数据压缩(第54天)

文章目录 前言2.3.3 管理分区2.3.3.1 增加分区2.3.3.2 删除分区2.3.3.3 恢复分区2.3.3.4 查看分区 2.3.4 设置分桶2.3.4.1 随机分桶&#xff08;自 v3.1&#xff09;2.3.4.2 哈希分桶2.3.4.2.1 优点2.3.4.2.2 如何选择分桶键2.3.4.2.3 注意事项 2.3.4.3 确定分桶数量 2.3.5 最佳…...

为什么有时候银行贷款审核会查大数据信用?

在申请银行贷款时&#xff0c;不少人会疑惑为何银行会深入审查申请人的大数据信用信息。这背后&#xff0c;其实是银行风险控制与精准决策的体现。 首先&#xff0c;大数据信用信用能全面反映申请人的信用状况 它不仅仅局限于传统的征信报告&#xff0c;还涵盖了消费行为、社交…...

LoRa无线通讯,让光伏机器人实现无“线”管理

光伏清洁机器人&#xff0c;作为光伏电站运维的新兴关键设备&#xff0c;已跃升为继组件、支架、光伏逆变器之后的第四大核心组件&#xff0c;正逐步成为光伏电站的标准配置。鉴于光伏电站普遍坐落于偏远无人区或地形复杂之地&#xff0c;光伏清洁机器人必须具备远程操控能力、…...

买流量卡要注意什么,这些冷知识你一定要懂!

买流量卡要注意什么&#xff1f;别总盯着价格看&#xff0c;还有一些隐形的冷知识得了解一下&#xff0c;今天这篇文章就是要告诉你一些流量卡中隐藏的冷知识。 ​一、首先&#xff0c;那些月租9元、19元的流量卡&#xff0c;大概率都是短期卡&#xff0c;虽然他们的资费便宜&a…...

【嵌入式】STM3212864点阵屏使用SimpleGUI单色屏接口库——(2)精简字库

一 开源库简介与移植 最近一个项目需要用12864屏幕呈现一组较为复杂的菜单界面&#xff0c;本着不重复造轮子的原则找到了SimpleGUI开源库。 开源地址&#xff1a;SimpleGUI: 一个面向单色显示屏的开源GUI接口库。 SimpleGUI是一款针对单色显示屏设计的接口库。相比于传统的GUI…...

《计算机网络》(第8版)第1章 概述 复习笔记

第 1 章 概述 一、计算机网络在信息时代中的作用 计算机网络的两个重要功能&#xff1a; 1 &#xff0e;连通性 指互联网上的用户之间是相互连通的。 2 &#xff0e;共享&#xff08;资源共享&#xff09; 资源共享可以是信息共享、软件共享&#xff0c;也可以是硬件共享。此…...

银行数据质量保障体系建设实践

引言 在数字化转型浪潮中&#xff0c;数据中台成为企业实现数据驱动决策的关键支撑。它不仅整合了企业内外部的数据资源&#xff0c;还通过数据共享与复用&#xff0c;提升了运营效率和业务创新能力。然而&#xff0c;随着数据量的激增和数据来源的多样化&#xff0c;如何确保…...

笔记小结:《利用Python进行数据分析》二进制数据格式存储与web交互

提示&#xff1a;此节内容仅作了解即可 目录 二进制数据格式 使用HDF5 读取Microsoft Excel文件 二进制数据格式 实现数据的高效二进制格式存储最简单的办法之一是使用Python内置的pickle序列化。 Python 的 pickle 模块是一个用于序列化和反序列化 Python 对象结构的模块…...

电脑桌面图标变白了?3个方法20秒钟轻松解

电脑桌面图标变白了&#xff1f;3个方法20秒钟轻松解 ⚠️电脑桌面图标变白了&#xff0c;3种方法轻松解决 &#x1f6b8;方法一和方法二属于治标不治本的解决方法&#xff0c;但操作较为简单&#xff0c;在不同情况下有不成功的可能&#xff0c;方法三相对复杂一些&#xff0c…...

数据治理,管什么?

元数据&#xff08;Metadata&#xff09;&#xff1a;通俗地说就是描述数据的数据&#xff0c;比如数据的名称、属性、分类、字段信息、大小、标签等等。要做好数据的管理&#xff0c;元数据起到了举足轻重的作用。 参考数据&#xff08;Reference Data&#xff09;&#xff1…...

【前端】JavaScript入门及实战121-125

文章目录 121 滚轮事件122 键盘事件123 键盘移动div124 BOM125 History 121 滚轮事件 <!DOCTYPE html> <html> <head> <title></title> <meta charset "utf-8"> <style type"text/css">#box1 {width: 100px;h…...

pytest测试框架之http协议接口测试

1 接口测试 日常测试中接口测试是一项重要的工作&#xff0c;尤其是http协议的接口测试更加普遍,比如一些常用的测试框架或者工具&#xff08;robotframework框架&#xff0c;testng框架&#xff0c;postman等&#xff09;都支持http接口的测试&#xff0c;而这节内容主要介绍…...

FFmpeg源码:av_gcd函数分析

一、引言 公约数&#xff0c;是一个能同时整除几个整数的数。如果一个整数同时是几个整数的约数&#xff0c;称这个整数为它们的“公约数”&#xff1b;公约数中最大的称为最大公约数。对任意的若干个正整数&#xff0c;1总是它们的公约数。 公约数与公倍数相反&#xff0c;就…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...