• quote, quasiquote, unquote和unquote-splicing


    关于符号类型

    符号类型又称引用类型,在概要一文中本人介绍得非常的模糊,使很多初学者不理解。符号类型在Scheme语言中是最基础也是最重要的一种类型,这是因为Scheme语言的祖先Lisp语言的最初目的就是符号处理,在Scheme语言中几乎所有的东西都可以看做是符号或做为符号列表来处理,这也是我们把符号类型做为第一个问题研究的原因。

    与符号类型相关的关键字有四个,分别是:quote, quasiquote, unquote和unquote-splicing,如下所示:

    规范用法:(quote obj) 
    简化用法:'obj (注意,'为右单引号,"双引号下面的那个符号。) 
    意义:符号类型的定义,(quote obj)本身就是一个值,虽然它不如数字123这样直观。

    规范用法:(quasiquote obj) 
    简化用法:`obj (注意,`为左单引号,~波浪号下面的那个符号。) 
    意义:"类似符号"类型的定义,最好称之为逆符号类型,它可以将符号类型转换为具有实际意义的东西。

    规范用法:(unquote obj) 
    简化用法:,obj (注意,,逗号,<小于号下面的那个符号。) 
    意义:"非符号"类型的定义,非符号类型出现在符号类型或逆符号类型定义中间,它不直接做为符号类型使用,而是将运算结果做为符号类型的一部分

    规范用法:(unquote-splicing obj) 
    简化用法:,@obj 
    意义:非符号类型的拼接,注意:,@ 两个符号做为一个操作符来使用)。当非符号类型是一些复杂算法时,需要用它来做一下拼接,以达到符号类型的目的。 
    上面所说的所有规范用法和简化用法的功能都是相同的。

    符号类型的意义在于,一个说明,英文单词zebra指的是活生生的斑马,而'zebra或(quote zebra)指的是由字母z、e、b、r、a构成的这串符号(不是字符串),就象我们定义变量(define x 100),这时x指的就是100这个数值,而'x或(quote x)则代表字母x构成的这个符号。

    首先看一段代码:

    guile> (define s '(good morning))
    guile> s
    (good morning)
    guile> (symbol? s)
    #f
    guile> (list? s)
    #t
    guile> (symbol? (list-ref s 1))
    #t

    从此示例中可以看出,用quote定义的列表的类型仍是列表,而列表中的某一值的类型则是符号类型。还可以看出有点类似于如下:

    (+ 1 (+ 2 (+ 3 (+ 4 5))))  ==>  (+ 1 2 3 4 5)
    (list 'a 'b 'c 'd 'e)      ==>  '(a b c d e)

    两者有异曲同工之妙,减少了多余的操作符,使表达式更直观,更容易理解。

    从 '(1 2 3 4 5) ==> (1 2 3 4 5) 可以看出,由符号类型的定义来形成列表,这是Scheme语言继承自LISP语言的传统。

    下面是在guile中的用法示例:

    guile> `(1 ,(+ 1 1) 3)
    ‘(1 2 3)
    guile> (quasiquote (1 (unquote (+ 1 1)) 3))
    ’(1 2 3)
    ;;;第一个是简化用法,第二个是标准用法。
    guile> `(1 ,@(map + '(1 3) '(2 4)) 9)
    (1 3 7 9)
    guile> (quasiquote (1 (unquote-splicing (map + (quote (1 3)) (quote (2 4)))) 9))
    (1 3 7 9)
    ;;;第一个是简化用法,第二个是标准用法(注意:,@ 两个符号做为一个操作符来使用)。

    从示例中我们可以看出,这些应用多数与列表有关,而处理列表是Scheme语言的关键所在。符号类型的用法对深入理解Scheme语言也非常关键,因为Scheme语言本身就可以理解为是这种符号类型的列表,处理符号类型就是处理Scheme语言本身。

    转自:http://www.ibm.com/developerworks/cn/linux/l-schm/part3/

    `(qq template)
    反引用表达式用于在已知结构中(但不是全部)目标结构的情况下创建表或向量结构,如果(qq template)
    中没有出现逗号,`(qq template)的求值结果与'(qq template)中求值结果相同,但是如果出现了逗号,逗号号的
    表达式就会被求值(“接触引用,unquoted"),其结果代替逗号和表达式被插入到结构中,如果逗号后面还紧跟着
    一个@符号,后面的表达式就被视为一个表,该表的前后括号随即被”剥离“,表中的元素被插入到,@及其后的位置
    。 ,@只能出现在表和向量的(qq template)中

    > `(list ,(+ 1 2) 4)
    '(list 3 4)
    > (let ((name 'a)) `(list ,name ',name))
    '(list a 'a)

    > `((foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons)))
    '((foo 7) . cons)

    参考:http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/r5rscn.pdf

  • 相关阅读:
    汇编指令lodsb和stosb、lodsd和stosd
    编码查询
    CLD汇编指令
    Win32编程
    MessageBox
    windows 数据类型
    STL总结
    解析结构化异常处理(SEH)(第二部分)
    FS[XX]
    ShellCode入门(提取ShellCode)
  • 原文地址:https://www.cnblogs.com/youxin/p/3551547.html
Copyright © 2020-2023  润新知