标签:emacs lisp
最近两天看了Gnu.Emacs.Lisp编程入门一书,把书中的代码示例都写了出来,以及书中的练习题,供有需要的同志使用。
注意:分号后面内容是对应函数及表达式的结果。
:-)
;; Chapter 1: 列表处理 ; 在Lisp中,数据和程序都以同样的方式表示;也就是说,它们都是由空格分割、 ; 由括号括起来的单词、数字或者其他列表的列表。 ; 在一个列表中,列表的元素被称为“原子”,不可再被分割为更小的部分。列表 ; 中的原子是由空格一一分割的。 ; 双引号中的文本,不论是句子还是段落,都是一个单个原子,被称为串string ‘(this list includes "text between quotation marks.") ;(this list includes "text between quotation marks.") ; 列表中的空格数量是无关紧要的 ; 单引号,被称为一个引用。当单引号位于一个列表之前时,它告诉lisp不要对 ; 这个列表做任何操作,而仅仅是按其原样。 ; 但是,如果一个列表前没有引号,这个列表中的第一个符号就很特别了: ; 它是一条计算机要执行的命令(在Lisp中,这些命令被称作函数) (+ 2 2) ;4 ‘(this is a quoted list) ;(this is a quoted list) (this is a quoted list) ;Symbol‘s function definition is void: this ;; Lisp解释器 ; Lisp解释器对一个列表求值时它做些了什么:首先,它查看一下在列表前面是 ; 否有单引号。如果有,解释器就为我们给出这个列表。如果没有引号,解释器 ; 就查看列表的第一个元素,并判断它是否是一个函数定义。如果它确实是一个 ; 函数,则解释器执行函数定义中的指令。否则,解释器打印一个错误消息。 (+ 2 (+ 3 3)) ;8 ; 一个函数参量是函数后面的原子或者列表 kill-ring-max ;60 ;; Chapter 2: 求值实践 (buffer-name) "*scratch*" (buffer-file-name) "f:/Misc/elisp.org" (concat "abc" "def") "abcdef" (substring "The quick brown fox jumped." 16 19) "fox" (+ 2 fill-column) 72 ;; here is a problem (concat "The " (+ 2 fill-column) " red foxes.") (+) ;0 (*) ;1 (+ 3) ;3 (* 3) ;3 (+ 3 4 5) ;12 (* 3 4 5) ;60 ;(+ 2 ‘hello) (message "This message appears in the echo area!") "This message appears in the echo area!" (message "The name of this buffer is: %s." (buffer-name)) "The name of this buffer is: elisp.org." (message "The value of fill-column is %d." fill-column) "The value of fill-column is 70." (message "There are %d %s in the office!" (- fill-column 14) "pink elephants") "There are 56 pink elephants in the office!" (message "He saw %d %s" (- fill-column 34) (concat "red " (substring "The quick brown foxes jumped." 16 21) " leaping.")) "He saw 36 red foxes leaping." (set ‘flowers ‘(rose violet daisy buttercup)) flowers ; C-x C-e, aware the echo area->rose violet daisy buttercup ‘flowers ; aware the echo area->flowers (setq carnivores ‘(lion tiger leopard)) (setq trees ‘(pine fir oak maple) herbivorses ‘(gazelle antelope zebra)) ;; create an couner, increment by 1 (setq counter 0) (setq counter (+ counter 1)) ; press C-x C-e many times, will get many values counter ;; create an counter, increment by 2 (setq counter1 0) (setq counter1 (+ counter1 2)) ; press C-x C-e many times, will get many values (buffer-name) ;"elisp.el" ; only get the filename (buffer-file-name) ; "f:/Misc/elisp.el" ; get the filename and its path (current-buffer) ; #<buffer elisp.el> (other-buffer) ; #<buffer *Buffer List*> (switch-to-buffer (other-buffer)) (buffer-size) ; 1814 (point) (point-max) (point-min) ;; Chapter 3: 如何编写函数定义 ;; 当注册一个函数后,在函数的最后一个括号后,使用"C-x C-e"来使之生效。 ; Version 1 ;(defun multiply-by-seven (number) ; "Multiply NUMBER by seven." ; (* 7 number)) (multiply-by-seven 3) ; 21 ; Version 2 (defun multiply-by-seven (number) "Multiply NUMBER by seven." (interactive "p") (message "The result is %d" (* 7 number))) (multiply-by-seven 3) ; "The result is 21" (let ((zebra ‘stripes) (tiger ‘fierce)) (message "One kind of animal has %s and another is %s." zebra tiger)) ;"One kind of animal has stripes and another is fierce." (let ((birch 3) pine fir (oak ‘some)) (message "Here are %d variables with %s, %s, and %s value." birch pine fir oak)) ;"Here are 3 variables with nil, nil, and some value." (if (> 5 4) (message "5 is greater than 4!")) ;"5 is greater than 4!" ;; Version 1: type-of-animal (defun type-of-animal (characteristic) "Print message in echo area depending on CHARACTERISTIC. If the CHARACTERISTIC is the symbol ‘fierce‘, then warn of a tiger." (if (equal characteristic ‘fierce) (message "It‘s a tiger!"))) (type-of-animal ‘fierce) ; "It‘s a tiger!" (type-of-animal ‘zebra) ; nil (if (> 4 5) ; if-part (message "5 is greater than 4!") ; then-part (message "4 is not greater than 5!")) ; else-part ;; Version 2: type-of-animal (defun type-of-animal (characteristic) ; Second version "Print message in echo area depending on CHARACTERISTIC. If the CHARACTERISTIC is the symbol ‘fierce‘, then warn of a tiger; else say it‘s not fierce." (if (equal characteristic ‘fierce) (message "It‘s a tiger!") (message "It‘s not fierce!"))) (type-of-animal ‘fierce) ;"It‘s a tiger!" (type-of-animal ‘zebra) ;"It‘s not fierce!" (if 4 ‘true ‘false) ;true (if nil ‘true ‘false) ;false (> 5 4) ;t (> 4 5) ;nil (let ((foo (buffer-name)) (bar (buffer-size))) (message "This buffer is %s and has %d characters." foo bar)) ;"This buffer is elisp.el and has 3811 characters." (message "We are %d characters into this buffer." (- (point) (save-excursion (goto-char (point-min)) (point)))) (emacs-version) ; "GNU Emacs 24.4.1 (x86_64-w64-mingw32) of 2014-10-21 on KAEL" (substring (emacs-version) 10 12) ;"24" ;; Problem (if (string= (int-to-string 24) (substring (emacs-version) 10 12)) (message "This is version 24 Emacs") (message "This is not version 24 Emacs")) (defun is-larger-fill-column (number) "This function" (if (> number fill-column) (message "%d is larger than fill-column!" number) (message "%d is not greater than fill-column!" number))) ;; Exercise 1: (defun two-times (number) "multi number by 2" (message "multi %d by 2 is: %d" number (* 2 number))) (two-times 2) ;"multi 2 by 2 is: 4" (two-times 25) ;"multi 25 by 2 is: 50" (defun two-times (number) "multi number by 2" (interactive "p") (message "multi %d by 2 is: %d" number (* 2 number))) ;; Exercise 2: (is-larger-fill-column 23) ;"23 is not greater than fill-column!" (is-larger-fill-column 73) ;"73 is larger than fill-column!" ;; Chapter 4: 与缓冲区有关的函数 ; beginning-of-buffer (defun simplified-beginning-of-buffer () "Move point to the beginning of the buffer; leave mark at previous position." (interactive) (push-mark) (goto-char (point-min))) ;; Chapter 5: 更复杂的函数 ;; Chapter 6:变窄和增宽 ;; Chapter 7: 基本函数:car、cdr、cons ; cons -> construct ; car -> Contents of the Address part of the Register (寄存器地址的部分内容) ; car 返回列表的第一个元素, ; cdr -> Contents of the Decrement part of the Register (寄存器后部内容) ; cdr 返回第一个元素后的所有内容 (car ‘(rose violet daisy buttercup)) ; output: rose (cdr ‘(rose violet daisy buttercup)) ; output: (violet daisy buttercup) (car ‘((lion tiger cheetah) (gazelle antelope zebra) (whale dolphin seal))) ; output: (lion tiger cheetah) (cdr ‘((lion tiger cheetah) (gazelle antelope zebra) (whale dolphin seal))) ; output: ((gazelle antelope zebra) (whale dolphin seal)) (cons ‘pine ‘(fir oak maple)) ; output: (pine fir oak maple) (cons ‘buttercup ()) ; (buttercup) (cons ‘daisy ‘(buttercup)) ; (daisy buttercup) (cons ‘violet ‘(daisy buttercup)) ; (violet daisy buttercup) (cons ‘rose ‘(violet daisy buttercup)) ; (rose violet daisy buttercup) (length ‘(buttercup)) ; 1 (length ‘(daisy buttercup)) ; 2 (length (cons ‘violet ‘(daisy buttercup))) ; 3 (length ()) ; 0 (length ) ; (wrong-number-of-arguments length 0) (cdr ‘(pine fir oak maple)) ; (fir oak maple) (cdr ‘(fir oak maple)) ; (oak maple) (cdr ‘(oak maple)) ; (maple) (cdr ‘(maple)) ; nil (cdr ‘nil) ; nil (cdr ()) ; nil (cdr (cdr ‘(pine fir oak maple))) ; (oak maple) (nthcdr 2 ‘(pine fir oak maple)) ; (oak maple) (nthcdr 0 ‘(pine fir oak maple)) ; (pine fir oak maple) (nthcdr 1 ‘(pine fir oak maple)) ; (fir oak maple) (nthcdr 3 ‘(pine fir oak maple)) ; (maple) (nthcdr 4 ‘(pine fir oak maple)) ; nil (nthcdr 5 ‘(pine fir oak maple)) ; nil (setq animals ‘(giraffe antelope tiger lion)) ; (giraffe antelope tiger lion) animals ; (giraffe antelope tiger lion) (setcar animals ‘hippopotamus) ; hippopotamus animals ; (hippopotamus antelope tiger lion) (setq domesticated-animals ‘(horse cow sheep goat)) ; (horse cow sheep goat) domesticated-animals ; (horse cow sheep goat) (setcdr domesticated-animals ‘(cat dog)) ; (cat dog) domesticated-animals ; (horse cat dog) ;; Chapter 8: 剪切和存储文本 ;; Chapter 9: 列表是如何实现的 (setq bouquet ‘(rose violet buttercup)) ; (rose violet buttercup) (setq flowers (cdr bouquet)) ; (violet buttercup) (setq bouquet (cons ‘lilly bouquet)) bouquet (eq (cdr (cdr bouquet)) flowers) ;t (setq flowers ‘(violet buttercup)) ;(violet buttercup) (setq flowers (cons ‘liu flowers)) ;(liu violet buttercup) (setq flowers (cons ‘laven flowers)) ;(laven liu violet buttercup) (setq more-flowers flowers) more-flowers ;(laven liu violet buttercup) (setq myfish (car flowers)) ;laven more-flowers ;(laven liu violet buttercup) ;; Chapter 10: 找回文本 kill-ring-max ;60 (car kill-ring) ;#("(car kill-ring)" 0 15 (fontified t)) (car (nthcdr 0 kill-ring)) (car (nthcdr 1 kill-ring)) (car (nthcdr 2 kill-ring)) (car (nthcdr 3 kill-ring)) (car (nthcdr 4 kill-ring)) ;; Chapter 11: 循环和递归 (setq animals ‘(giraffe gazelle lion tiger)) animals (defun print-elements-of-list (list) "Print each elements of LIST on a line of its on." (while list (print (car list)) (setq list (cdr list)) ) ) (print-elements-of-list animals) ; ;giraffe ; ;gazelle ; ;lion ; ;tiger ;nil (defun triangle (number-of-rows) "Add up the number of pebbles in a triangle. The first row has one pebble, the second row two pebbles, the third row three pebbles, and so on. The argument is NUMBER-OF-ROW." (let ((total 0) (row-number 1)) (while (<= row-number number-of-rows) (setq total (+ total row-number)) (setq row-number (1+ row-number))) total)) (triangle 4) ;10 (triangle 7) ;28 ;; Chapter 12: 正则表达式查询
本文出自 “天道酬勤” 博客,请务必保留此出处http://lavenliu.blog.51cto.com/5060944/1614126
标签:emacs lisp
原文地址:http://lavenliu.blog.51cto.com/5060944/1614126