diff --git "a/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/2.\344\270\200\344\272\233\350\247\243\351\207\212\345\222\214\347\272\246\345\256\232/exercise_02.md" "b/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/2.\344\270\200\344\272\233\350\247\243\351\207\212\345\222\214\347\272\246\345\256\232/exercise_02.md" index 4f5832b90f48c4f06d30749cdb52241e0e17d03e..60590f33034d9aba61873a821b300f660c4fe3b1 100644 --- "a/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/2.\344\270\200\344\272\233\350\247\243\351\207\212\345\222\214\347\272\246\345\256\232/exercise_02.md" +++ "b/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/2.\344\270\200\344\272\233\350\247\243\351\207\212\345\222\214\347\272\246\345\256\232/exercise_02.md" @@ -1,42 +1,4 @@ -# 禁止的符号 - -Scheme对标识符的宽容度远大于其他语言,你甚至可以在标识符里使用数学符号+-*/><,但仍有一些符号严格禁止使用在标志符里。 - -在Scheme里它们大多数是预留的读取器宏。 - -> 读取器宏是一种在编译前对代码进行替换的工具,你可以将它看作高级版的C语言宏。在Scheme的近亲语言,Common Lisp里你可以自由的编写读取器宏。在Scheme的世界里读取器宏被视作邪恶而混乱的,只预留了少量程序语言标准层面的读取器宏来简化程序编写。 - -``` -# -``` - -编译器预留符号, 它用来表示字符,比如`#\a #\b #\c`。用来表示进制数,比如`#b100 #x7C0`,用来表示向量,比如`#(1 2 3)`。用来表示编译器行为钩子,比如`(#3%display "Hello,World!")`在ChezScheme中表示强制用第三级优化火力全开的display hello world。 - -``` -' 单引号 -``` -读取器宏,`'object`将在编译前被替换成`(quote object)`。它也用来表示列表,如`'(a b c)`. - -> 在Scheme中,quote有重要的作用,它代表标志符的符号的一面。而不被quote住的标志符代表它作为程序的一面。LISP与其他程序语言最大的区别即是代码即是数据,数据即是代码。在这种情况下我们必须明确一个标志符在当下是否被自动进行求值。即它对编译器展现它名字的一面,还是它程序的一面。这个区别便由quote来表示。 - -``` -` 往右斜的单引号 -``` -读取器宏,```object``将在编译前被替换成`(quasiquote object)`。 - -``` -, 逗号 -``` -读取器宏,`,object`将在编译前被替换成`(unquote object)`。 - -``` -@ -``` -读取器宏,`,@object`将在编译前被替换成`(unquote-splicing object)`。 - - - # 约定的代码风格 以下的代码风格并不由编译器严格要求,但是它能帮助你更好的编写Scheme程序,还有助于其他人更好的阅读你的代码。 diff --git "a/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/3.\346\240\207\345\277\227\347\254\246/exercise_03.md" "b/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/3.\346\240\207\345\277\227\347\254\246/exercise_03.md" new file mode 100644 index 0000000000000000000000000000000000000000..c3d3ecf2adecea75650b9ab45a3bd08ea5a6b9ec --- /dev/null +++ "b/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/3.\346\240\207\345\277\227\347\254\246/exercise_03.md" @@ -0,0 +1,35 @@ +# 标志符 + +Scheme对标识符的宽容度远大于其他语言,你甚至可以在标识符里使用数学符号+-*/><,但仍有一些符号严格禁止使用在标志符里。 + +在Scheme里它们大多数是预留的读取器宏。 + +> 读取器宏是一种在编译前对代码进行替换的工具,你可以将它看作高级版的C语言宏。在Scheme的近亲语言,Common Lisp里你可以自由的编写读取器宏。在Scheme的世界里读取器宏被视作邪恶而混乱的,只预留了少量程序语言标准层面的读取器宏来简化程序编写。 + +``` +# +``` + +编译器预留符号, 它用来表示字符,比如`#\a #\b #\c`。用来表示进制数,比如`#b100 #x7C0`,用来表示向量,比如`#(1 2 3)`。用来表示编译器行为钩子,比如`(#3%display "Hello,World!")`在ChezScheme中表示强制用第三级优化火力全开的display hello world。 + +``` +' 单引号 +``` +读取器宏,`'object`将在编译前被替换成`(quote object)`。它也用来表示列表,如`'(a b c)`. + +> 在Scheme中,quote有重要的作用,它代表标志符的符号的一面。而不被quote住的标志符代表它作为程序的一面。LISP与其他程序语言最大的区别即是代码即是数据,数据即是代码。在这种情况下我们必须明确一个标志符在当下是否被自动进行求值。即它对编译器展现它名字的一面,还是它程序的一面。这个区别便由quote来表示。 + +``` +` 往右斜的单引号 +``` +读取器宏,```object``将在编译前被替换成`(quasiquote object)`。 + +``` +, 逗号 +``` +读取器宏,`,object`将在编译前被替换成`(unquote object)`。 + +``` +@ +``` +读取器宏,`,@object`将在编译前被替换成`(unquote-splicing object)`。 \ No newline at end of file diff --git "a/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/4.\345\256\232\344\271\211/exercise_04.md" "b/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/4.\345\256\232\344\271\211/exercise_04.md" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/5.\346\225\260\346\215\256\347\261\273\345\236\213/exercise_05.md" "b/data/1.Scheme\345\210\235\351\230\266/1.Scheme\345\205\245\351\227\250/5.\346\225\260\346\215\256\347\261\273\345\236\213/exercise_05.md" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391