soc*_*soc 41 haskell programming-languages metaprogramming quoting nemerle
像Haskell(或Nemerle)这样的语言有quasiquotations.我想知道"准"是什么意思,如果没有"准"部分也存在"引用".
Vla*_*eev 41
我相信这个概念来自Lisp语言.
用Lisp编写的程序包含一系列列表列表等,如下所示:
(defn f [x y] (+ x y))
Run Code Online (Sandbox Code Playgroud)
由于这种一致性,可以将这样的代码表示和操作为数据,因此上面的字符序列被解释为文字列表.这是Lisps的一个非常有用的功能,它是一个独特的功能.为方便起见,Lisp语言允许"引用"有意义的序列,将它们从定义和表达式转换为列表.它看起来像这样:
'(defn f [x y] (+ x y))
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它是一个文本列表,直接供拆解可使用类似物Haskell的中head和tail等方法.因此,'quote'的意思是'从列表中创建一个字面值'.
但是,使用head- 和 - tail类函数直接操作列表并不方便.当您开始编写复杂的宏甚至宏生成宏时,它变得值得注意.所以这里出现'quasiquotation',字面意思是"几乎是一个引用".通常quasiquotation看起来像普通引用(但使用另一个引号):
`(defn f [x y] (+ x y))
Run Code Online (Sandbox Code Playgroud)
但它更强大.在quasiquoted列表中,您可以使用外部作用域中的实际值替换任意元素,从而基本上获得类似模式的内容.例:
(let [z 10] `(defn f [x y] (+ x y ~z)))
Run Code Online (Sandbox Code Playgroud)
这里我们将值绑定10到z变量,然后我们在quasiquote中替换它.这个表达产生
'(defn f [x y] (+ x y 10))
Run Code Online (Sandbox Code Playgroud)
这是一个简单的例子; Lisp语言允许使用quasiquotes做许多其他有用的事情.
这个概念已转移到支持使用语法树进行操作的其他语言.例如,这里的Haskell工具是Template Haskell,它完全支持quasiquotation,即创建模板并用外部范围的值填充它们.在具有复杂语法的语言(如Haskell)中,准引用和简单引用几乎成为操纵语法树的唯一理智方式.
UPD:嗯,似乎在Haskell中它比简单替换更复杂.Haskell中的Quasiquote看起来像任意变换器和表达式的评估器,可以由用户定义.
Ale*_* C. 19
这些概念存在于Lisp语言及其变体中.
在这些语言中,只要解释器看到列表(a b c ... z),它就会通过应用于其他元素来对其进行评估.ab ... z
如果您想要一个不被评估的列表(因此被解释为一个列表),您必须引用它.例如,'(a b c)评估为包含三个元素的列表,而不是a应用于b和c.您可以将报价视为停止评估.
现在,quasiquotation的行为类似于引号,除了您可以在列表的某些部分内恢复评估.你使用反向撇号"quasiquote",你允许某些子表达式不带引号运算符(至少在Scheme中,我不知道其他Lisp变体).例如
`(a ,(b c))
Run Code Online (Sandbox Code Playgroud)
评估到包含两个元素的列表:a和评估结果(b c).
这对于构建模板特别有用,您可以通过取消引用来填充漏洞.示例(取自那里):
(define (create-shipping-employee-association name)
`((name ,name)
(employee-id-no ,(get-next-employee-id!))
(department shipping)
(hire-date ,(get-day) ,(get-month) ,(get-year))))
Run Code Online (Sandbox Code Playgroud)
小智 5
在Nemerle中,一个准引用是(http://nemerle.org/metaprogramming.pdf):
"
元语言是用于编程这种操作的语言.它通常有自己的语法来描述对象语言的各种结构.
例如,在我们的系统中:
<[ 1 + f (2 * x) ]>
Run Code Online (Sandbox Code Playgroud)
表示表达式的语法树:
1 + f (2 * x)
Run Code Online (Sandbox Code Playgroud)
这种想法被称为准报价.
前缀准来源于将元语言表达式的值插入引用的上下文中的可能性.
如果g(y)是这样的表达,我们可以写:
<[ 1 + $(g(y)) ]>
Run Code Online (Sandbox Code Playgroud)
它描述了一个语法树,其第二部分被评估结果所取代 g(y)
"