- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近与一位同事交谈,并试图告诉他(通用)Lisp 的美妙之处。我试图以某种方式解释宏,因为我认为宏是 Lisp 的 killer 级特性之一,但我失败得很惨——我找不到一个很好的例子,它简短、简洁并且“凡人”可以理解"程序员(十年的 Java 经验,一个非常聪明的人,但对“高阶”语言的经验很少)。
如果必须的话,您会如何通过示例来解释 Lisp 宏?
最佳答案
根据我的经验,当人们看到它如何帮助生成程序或其他结构无法生成的代码时,宏会给人们留下最好的印象。通常这样的事情可能被描述为:
<common code>
<specific code>
<other common code>
哪里<common code>
总是一样的。以下是此类架构的一些示例:
<强>1。 time
宏。 没有宏的语言中的代码将如下所示:
int startTime = getCurrentTime();
<actual code>
int endTime = getCurrentTime();
int runningTime = endTime - startTime;
您不能将所有通用代码都放在过程中,因为它包装了实际代码。 (好吧,如果语言支持的话,你可以制作一个过程并在 lambda 函数中传递实际代码,但并不总是很方便)。
而且,您很可能知道,在 Lisp 中您只需创建 time
宏并将实际代码传递给它:
(time
<actual code>)
<强>2。事务。 请 Java 程序员编写简单的方法 SELECT
使用 JDBC - 需要 14-17 行,包括打开连接和事务的代码,关闭它们,多个嵌套 try-catch-finally
语句和只有 1 或 2 行唯一代码。
在 Lisp 中你只需写 with-connection
宏并将代码减少到 2-3 行。
<强>3。同步。 好吧,Java、C# 和大多数现代语言都已经有它的语句,但是如果您的语言没有这样的结构怎么办?或者,如果您想引入新的同步方式,例如 STM基于交易?同样,您应该为此任务编写单独的类并手动使用它,即在您要同步的每个语句周围放置通用代码。
这只是几个例子。你可以提到“不要忘记”的宏,比如 with-open
系列,清理环境并保护您免受资源泄漏,新构造宏,如 cond
而不是多个 if
s,当然,不要忘记像 if
这样的惰性构造, or
和 and
,不评估他们的论点(与程序申请相反)。
一些程序员可能会主张,他们的语言有一种技术来处理这种或那种情况(ORM、AOP 等),但是问他们,如果存在宏,是否需要所有这些技术?
因此,综合考虑并回答有关如何解释宏的原始问题。将 Java 中任何广泛使用的代码(C#、C++ 等)转换为 Lisp,然后将其重写为宏。
关于macros - 是否有向 "generic"程序员解释 Lisp 宏的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4558970/
在 PHP 中,开始破解并弄清楚页面上发生的事情非常容易。只需输入一堆回声和 print_r,仅此而已。看来这种技术在 python 中对我不起作用。我通过在 python 照片上传模块中进行黑客攻击
程序员/后端开发方向Java 跳槽注意事项(简历和面试经验分享) 应届生面试经验参考:https://www.cnblogs.com/rainbow-1/p/16779048.html 简历: 1、
上图的意思: 百战百胜,屡试不爽. 故事 程序员小张: 刚毕业,参加工作1年左右,日常工作是CRUD 。 架构师老李: 多个大型项目经验,精通各种开发架构屠龙宝术;
周末了开心一下 谈到程序员,对于外行人来说一贯的印象就是格子衫大裤衩外加人字拖,蓬头(秃头)垢面黑眼圈,还有就是“人傻钱多死得快”🤣,这是外界对程序员固有的思想,但是作为新世纪的程序员,我们可没那么
我从事C++编程已有5年了,现在我意识到知道如何“不同地”思考的值(value)。 这个问题适用于尝试其他编程语言并遇到过类似情况的C++程序员: “哇,这太酷了!我不知道我可以那样编程。” “哇,我
互联网已经渗入我们生活的方方面面,于是我们就免不了会思考:如果有一天网络断了怎么办呢? 英国 Cable.co.uk 曾进行了一项有趣的"断网"调查,调查发现在 2500
这些是 “程序员可见” x86-64 寄存器: (来源:usenix.org) 隐形寄存器呢?刚刚才知道MMU寄存器,Interrupt Descriptor Table(IDT)使用了这些不可见的寄
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
有没有办法将 Dragon NaturallySpeaking 合并到事件驱动程序中?如果我使用 DNS 记录用户语音输入而不将其写入屏幕并直接保存为 XML,我的老板会非常喜欢它。我已经研究了好几天
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
这个问题在这里已经有了答案: 关闭12年前。 Possible Duplicate: Should I learn C before learning C++? 作为一名专业 (Java) 程序员和重
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在将一个使用串行端口的 C++ 程序(更准确地说是 Borland“组件”)“转换”为 Java。该程序使用一个线程来监听串行端口,并在收到给定的“事件字符”之一(可能是回车、ACK、NACK .
我是克里斯。我对编码很陌生,我不知道很多术语,这是我第三次也是最成功的学习 Java 的尝试。是的,如果我还年轻,效果就不太好。无论如何,我正在尝试创建游戏,但遇到了一个小问题。 我制作了一个 16
我是一名优秀的程序员,十分优秀!