同像性,它是如何运作的?

2023-12-23

有人可以推荐解释同像性概念的文章,尤其是使用 Clojure 的文章。为什么 Clojure 是同音的,但在 Java 等其他语言中却很难做到这一点?


在我继续讨论一些我想添加另一个答案的事情之前,这里还有一个参考——与同像性相关的部分相当短,但由 Rich Hickey 进行解释! 9频道有这个不错的视频 http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/Rich Hickey 和 Brian Beckman 谈论 Clojure。可以理解的是,并发性是主要焦点,但同像性确实有自己的(短暂的)屏幕时间,在此期间,里奇很好地解释了两者之间的相互作用read(将程序员写下的具体语法转换为从列表等构建的内部表示的函数)和eval。他有这张漂亮的图表展示了如何eval甚至不知道它评估的代码来自read对文本文件进行操作...亚瑟已经解释了其背后的要点,但是嘿,无论如何请观看它,这是一个非常好的视频!


免责声明:我将在下一个水平条下方提及 Java 和 Python 作为示例。我想澄清的是,下面只是一个粗略的概述,说明为什么我认为制作一个同像的、支持 Lisp 风格的宏的 Java 或 Python 可能很困难;不过,这只是一项学术练习,我不想首先考虑是否有任何理由去尝试的问题。还,我不想暗示具有 Lisp 风格宏的语言的语法必须包含树结构的显式分隔符; Dylan(无父母 Lisp?)显然提供了一个反例。最后,我使用这个表达Lisp 风格的宏因为我只研究 Lisp 风格的宏。例如,Forth 语言有一个不同的宏工具,我并不真正理解它,只是我知道它可以启用看起来很酷的代码。显然,语法扩展可以通过多种方式实现。有了这个……


我想回答你问题的第二部分——为什么大多数编程语言被认为不是同像的?在这个过程中我将不得不触及 Lisp 的语义,但是由于 Nils 已经提供了关于术语“同像”本身的良好信息源的链接,并且 Arthur 描述了读取 -> 宏扩展 -> 编译循环,如图所示在 Clojure 中,我将在下文中以此为基础。首先,让我引用 Alan Kay 的一段话(摘自维基百科文章,该文章也链接到原始来源):

Interactive LISP [...] 和 TRAC [...] 都是“同象的”,因为它们的内部和外部表示本质上是相同的。

(这些[...]位隐藏了很多文本,但要点没有改变。)

现在,让我们问自己一个问题:Java 的内部表示是什么?……好吧,这甚至没有意义。爪哇compilerJava确实有一定的内部表示,即抽象语法树;为了构造一个“同形 Java”,我们必须使 AST 表示成为 Java 中的一等对象and设计一种允许我们直接编写 AST 的语法。这可能会被证明是相当困难的。

Python 提供了一个非同像语言的示例,该语言很有趣,因为它目前附带了一个 AST 操作工具包,其形式为ast模块。该模块的文档明确指出 Python AST 可能会在版本之间发生变化,这可能会或可能不会令人沮丧;尽管如此,我认为勤奋的程序员可以接受ast模块,设计一种语法(可能基于 S 表达式,可能基于 XML)来直接描述 Python AST,并使用常规 Python 为该语法构造一个解析器ast,从而朝着创建具有 Python 语义的同像语言迈出了坚实的第一步。 (我相信不久前我遇到过一种 Lisp 方言编译为 Python 字节码......我想知道它是否可能在某种程度上做类似的事情?)

即便如此,从这种同像性中获取具体利益的问题仍然存在。它被视为 Lisp 语言家族成员的一项有益财产,因为它允许我们编写可以编写更多程序的程序,其中宏是最值得注意的。现在,虽然宏以一种方式启用,因为在 Lisp 中操作 Lisp 代码的内部表示非常容易,但它们也以同样重要的方式通过 Lisp 执行模型启用:Lisp 程序只是 Lisp 形式的集合;这些由 Lisp 函数处理eval它负责确定表达式的值并在正确的时间引起适当的副作用; Lisp 的语义正是eval。事物如何在内部工作以保持这种语义错觉同时相当快的问题是一个实现细节; Lisp 系统有义务公开一个函数eval给程序员并采取行动as ifLisp 程序正在由该函数处理。

在现代 Lisp 系统中,它是eval的合同,它执行一个额外的预处理阶段,在此期间宏在评估代码(或编译和运行,视情况而定)之前进行扩展。该特定设施并不是 Lisp 系统的必要部分,但将其插入此执行模型非常容易!另外,我想知道这是否不是唯一使 Lisp 类型的宏转换易于管理的执行模型,这意味着任何寻求合并 Lisp 风格宏的语言都必​​须采用类似的执行模型。我的直觉告诉我,事实确实如此。

当然,一旦一种语言以直接与其 AST 并行的符号写下来,并使用带有评估器函数/对象的类似 Lisp 的执行模型,人们一定想知道它是否是 Lisp 的另一种方言……即使它是AST 并行语法恰好是基于 XML 的。shudder

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同像性,它是如何运作的? 的相关文章

  • 在我的 Linux 机器上安装 lisp

    我使用 Vim 作为我的编辑器 Practical common Lisp 建议安装 Lispbox 我不知道如何使用 emacs 不知道如何用那个 T T 运行 lisp 代码 之后我找到了一个名为 limp vim 的 vim lisp
  • 宏、Clojure 与 Common Lisp

    我和我的一些朋友正在开发一个新平台 我们想用 lisp 构建它 主要吸引力是宏 我们都使用 Common Lisp 但我想探索 Clojure 的选择 当我提出这一点时 其中一位说宏观体系 较弱 我想知道这是否属实 以及在哪些领域 就您可以
  • 修改功能;保存到 Lisp 中的新函数

    所以我认为 lisp 在其他语言中 的优点之一是它能够实现函数工厂 接受函数作为参数 返回新函数 我想使用此功能对函数进行小的更改并将其保存为新函数 这样如果对原始函数进行更改 它们也会反映在它所基于的新函数中 注意 我不是编写原始函数的人
  • 我从 clojure 和 python 中得到的 hmac 签名略有不同

    我从 python 实现和 clojure 实现中获得的 HMAC SHA1 签名略有不同 我很困惑什么会导致这种情况 Python实现 import hashlib import hmac print hmac new my key my
  • 这两个 clojure 函数之间有什么区别和问题?

    对于课程项目的一部分 我正在实现一个函数来从文件中读取一些数据并根据该文件创建图形结构 一整天我问了几个问题 结果就是这样 下面是一个可以正常工作的函数 它首先以惰性序列的形式读入文件 然后循环解析每一行并将其打印出来 defn print
  • Clojure:生成所有键盘可输入字符

    Context 我想生成可以通过以下方式生成的所有字符 打开记事本 按键盘上的单个键 按住 Shift 按键盘上的单个键 我目前拥有的 concat range int a int z range int A int Z range int
  • Clojure 中 with-local-vars 和 with-bounds 之间的区别

    Clojure 的文档with local vars http clojuredocs org clojure core clojure core with local vars and with bindings http clojure
  • 解决斐波那契数列的 Lisp 方法

    我想尝试学习 Lisp 但很快就放弃了 我想我会再试一次 我正在看 求 400 万以下所有偶数斐波那契数的总和 我写了下面的代码 它可以工作 但是很丑陋 其中最主要的是它太慢了 因为它一直在进行简单的递归 当我用 Python 编写这个程序
  • F# 类型提供程序与 Lisp 宏

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • 为什么在 emacs-lisp 中的函数参数之前使用#'?

    我熟悉 Emacs Lisp 但不熟悉 Common 或任何其他 Lisp 一些 Lisp 程序员建议 例如emacs 的基本功能 https stackoverflow com questions 17076646 a basic fun
  • 从when语句内的函数返回

    我想做的就是使用 when 语句返回一个值 我想要以下功能 if x return y 我正在尝试使用 when x y 但是when语句并没有以退出函数并返回y的方式进行计算 它只是愉快地继续下一行 有没有办法做到这一点而不需要制作一个看
  • 无法删除 IntelliJ/Cursive 中的括号

    我正在使用 IntelliJ Cursive 编写 Clojure 我发现 删除括号的唯一方法就是将其中的内容完全删除 然后才能将括号删除 例如 假设我有以下代码 list 我只想删除左括号 一旦我在左括号上按退格键 IDE 就会忽略此行为
  • Clojure 宏expand

    Why does macroexpand arm getHand getFinger 扩展到 arm getHand getFinger while macroexpand gt arm getHand getFinger 扩展到 getF
  • Clojure 集合与序列的相等性

    我注意到 Clojure 1 4 似乎很乐意考虑向量等于seq相同的向量 但同样不适用于地图 1 2 seq 1 2 gt true 1 2 seq 1 2 gt false 为什么要这样的行为 这样会有所不同吗 Clojure 的 可以认
  • Clojure:只能从尾部位置重复

    我正在尝试递归地反转列表 但是我得到了Can only recur from tail position运行时 这到底意味着什么 如何改进我的代码才能使其正常工作 defn recursive reverse coll loop coll
  • 将数据库与 Clojure 结合使用

    有哪些使用 Clojure 数据库的方法 我从 Clojure 知道你可以用 Java 做任何事情 但这意味着我最终可能会使用一些过于复杂的东西 比如 Hibernate 这与 Clojure 的简单性相冲突 有什么建议或意见吗 Cloju
  • 如何在 emacs 中自动回答是或否

    I binded function semantic symref to key C c C r like this global set key kbd C c C r semantic symref everytime I presse
  • SBCL初始化文件

    我想知道应该在哪里保存 sbclrc 文件 我尝试将其保存在我的 sbcl 文件夹中 但它似乎不起作用 我使用的是 Windows XP 和 Emacs 版本 23 我正在尝试设置 asdf install 这就是为什么我要修改初始化文件
  • Scheme (Lisp) 中树的深度反转

    我对Scheme中的基本树数据结构进行了深度逆向 define deep reverse t cond null t not pair t t else cons deep reverse cdr t deep reverse car t
  • webjure 与 compojure?

    我听说过两个基于 Clojure 的 Web 应用程序框架 Webjure 和 Compojure 有人可以告诉我哪个更好吗 现在您可以添加Ring http groups google com group clojure browse t

随机推荐