gpt4 book ai didi

haskell - 准引号中的 “quasi” 是什么意思?

转载 作者:行者123 更新时间:2023-12-03 01:36:46 26 4
gpt4 key购买 nike

像 Haskell(或 Nemerle)这样的语言有 quasiquotations 。我想知道“准”是什么意思,是否也存在没有“准”部分的“引文”。

最佳答案

我相信这个概念来自 Lisp 语言。

用 Lisp 编写的程序由一系列列表的列表等组成,如下所示:

 (defn f [x y] (+ x y))

由于这种一致性,可以将此类代码作为数据来表示和操作,因此上面的字符序列被解释为文字列表。这是 Lisp 非常有用的特性,也是它们的显着特性之一。为了方便起见,Lisp 语言允许“引用”有意义的序列,将它们从定义和表达式转换为列表。它看起来像这样:

 '(defn f [x y] (+ x y))

在本例中,它是一个文字列表,可以直接使用 Haskell 的 headtail 的类似方法以及其他方法进行解构。因此,“引用”的意思是“从列表中生成一个文字值”。

但是,直接使用 headtail 之类的函数来操作列表并不方便。当您开始编写复杂的宏甚至宏生成宏时,它就会变得值得注意。所以这里出现了“准引用”,字面意思是“几乎是引用”。通常准引用看起来像普通引用(但带有另一个引用符号):

`(defn f [x y] (+ x y))

但它是更强大的东西。在准引用列表中,您可以用外部范围中的实际值替换任意元素,本质上获得类似模式的东西。示例:

 (let [z 10] `(defn f [x y] (+ x y ~z)))

这里我们将值 10 绑定(bind)到 z 变量,然后将其替换到准引号内。这个表达式产生

 '(defn f [x y] (+ x y 10))

这是一个简单的例子; Lisp 语言允许使用准引号做许多其他有用的事情。

这个概念已经转移到其他支持语法树操作的语言。例如,这里的 Haskell 工具是 Template Haskell,它完全支持准引用,即创建模板并用外部范围的值填充它们。在具有复杂语法的语言(如 Haskell)中,准引用和普通引用几乎成为操作语法树的唯一合理方式。

UPD:嗯,看来在 Haskell 中它是比简单替换更复杂的功能。 Haskell 中的 Quasiquote 看起来像是可以由用户定义的任意转换器和表达式求值器。

关于haskell - 准引号中的 “quasi” 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10556631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com