Lisp语言的后代,Scheme语言深入浅出
一、关于符号类型
符号类型又称引用类型,在概要一文中本人介绍得非常的模糊,使很多初学者不理解。符号类型在Scheme语言中是最基础也是最重要的一种类型,这是因为Scheme语言的祖先Lisp语言的最初目的就是符号处理,在Scheme语言中几乎所有的东西都可以看做是符号或做为符号列表来处理,这也是我们把符号类型做为第一个问题研究的原因。
与符号类型相关的关键字有四个,分别是:quote, quasiquote, unquote和unquote-splicing,如下所示:
规范用法:(quote obj)
简化用法:'obj (注意,'为右单引号,"双引号下面的那个符号。)
意义:符号类型的定义,(quote obj)本身就是一个值,虽然它不如数字123这样直观。
规范用法:(quasiquote obj)
简化用法:`obj (注意,`为左单引号,~波浪号下面的那个符号。)
意义:"类似符号"类型的定义,最好称之为逆符号类型,它可以将符号类型转换为具有实际意义的东西。
规范用法:(unquote obj)
简化用法:,obj (注意,,逗号,r /br / 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语言的祖先Lisp语言的最初目的就是符号处理,在Scheme语言中几乎所有的东西都可以看做是符号或做为符号列表来处理,这也是我们把符号类型做为第一个问题研究的原因。
与符号类型相关的关键字有四个,分别是:quote, quasiquote, unquote和unquote-splicing,如下所示:
规范用法:(quote obj)
简化用法:'obj (注意,'为右单引号,"双引号下面的那个符号。)
意义:符号类型的定义,(quote obj)本身就是一个值,虽然它不如数字123这样直观。
规范用法:(quasiquote obj)
简化用法:`obj (注意,`为左单引号,~波浪号下面的那个符号。)
意义:"类似符号"类型的定义,最好称之为逆符号类型,它可以将符号类型转换为具有实际意义的东西。
规范用法:(unquote obj)
简化用法:,obj (注意,,逗号,r /br / 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)
;;;第一个是简化用法,第二个是标准用法(注意:,@ 两个符号做为一个操作符来使用)。
顶(0)
踩(0)
- 最新评论