码迷,mamicode.com
首页 > 其他好文 > 详细

elisp 编程基础

时间:2016-04-10 12:40:53      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

elisp 编程基础

elisp 编程基础

1 指令

cmds description shortcut
eval-last-sexp 执行cursor左边的指令 C-x C-e
eval-region 执行选定的代码  
describe-function 描述函数功能 C-h f
view-echo-area-messages 查看buffer输出信息 C-h e

emacs指令繁多,但是借助smex的情况下,只要记住大概的英文即可运行。

注意 在emacs中运行elisp不需要在elisp-mode下。通过上述指令可以在 主模式为org-mode下运行elisp代码。

2 打印

(message "hi")

; printing variable values
(message "Her age is: %d" 16)        ; %d is for number
(message "Her name is: %s" "Vicky")  ; %s is for string
(message "My list is: %S" (list 8 2 3))  ; %S is for any lisp expression

3 数学运算

3.1 加减乘除

(+ 4 5 1)     ;    ? 10
(- 9 2)       ;    ?  7
(- 9 2 3)     ;    ?  4
(* 2 3)       ;    ?  6
(* 2 3 2)     ;    ? 12
(/ 7 2)       ;    ?  3 (integer part of quotient)
(/ 7 2.0)     ;    ?  3.5
(% 7 4)       ;    ?  3 (mod, remainder)
(expt 2 3)    ;    ? 8 (power; exponential)

这里的特殊情况和java相同。整数后+ .0算浮点数。

3.2 类型判断

;; 3. is a integer, 3.0 is a float
(integerp 3.) ; returns t
(floatp 3.) ; returns nil
(floatp 3.0) ; returns t

p→ predicate 这里和ios的数据很类似

3.3 字符串与数字转换

(string-to-number "3")
(number-to-string 3)

4 逻辑判断

4.1 真假判断

elisp里面nil和空list为假,其余都为真

(if nil "yes" "no") ; ? "no"
(if () "yes" "no") ; ? "no"
(if ‘() "yes" "no") ; ? "no"
(if (list) "yes" "no") ; ? "no", because (list) eval to a empty list, same as ()
(if 0 "yes" "no") ; ? "yes"
(if [] "yes" "no") ; ? "yes". The [] is vector of 0 elements

4.2 逻辑运算

4.2.1 and 和 or

(and t nil) ; ? nil
(or t nil) ; ? t

4.2.2 数字判断

(< 3 4) ; less than
(> 3 4) ; greater than
(<= 3 4) ; less or equal to
(>= 3 4) ; greater or equal to

(= 3 3)   ; ? t
(= 3 3.0) ; ? t

(/= 3 4) ; not equal. ? t

4.2.3 字符串判断

(string-equal "this" "this") ; ? t. Case matters.

4.2.4 equal

equal需要类型和值一样,这点和java类似。not→ !

;; testing if two values have the same datatype and value.
(equal "abc" "abc") ; ? t
(equal 3 3) ; ? t
(equal 3.0 3.0) ; ? t
(equal 3 3.0) ; ? nil. Because datatype doesn‘t match.

;; testing equality of lists
(equal ‘(3 4 5) ‘(3 4 5))  ; ? t
(equal ‘(3 4 5) ‘(3 4 "5")) ; ? nil

;; testing equality of symbols
(equal ‘abc ‘abc) ; ? t

(not (= 3 4)) ; ? t

5 变量

setq→ global var , let→ local var

5.1 全局变量

(setq x 1) ; assign 1 to x
(setq a 3 b 2 c 7) ; assign 3 to a, 2 to b, 7 to c

5.2 局部变量

(let (a b)
 (setq a 3)
 (setq b 4)
 (+ a b)
) ; returns 7

或者不用setq

(let ((a 3) (b 4))
 (+ a b)
) ; returns 7

注意,在let里面使用setq,则变量为局部变量。

6 代码块

使用progn来写代码块。

(progn (message "a") (message "b"))
;; is equivalent to
(message "a") (message "b")

可以用于真假判断。

(if something
    (progn ; true
    …
    )
    (progn ; else
    …
    )
)

progn会返回最后一条语句。

(progn 3 4 ) ; ? 4

7 遍历

(setq x 0)

(while (< x 4)
  (print (format "yay %d" x))
  (setq x (1+ x)))
(let ((x 32))
  (while (< x 127)
    (ucs-insert x)
    (setq x (+ x 1))))

退出遍历或函数使用catch throw

(defun test-exit-f ()
  "example. using catch/throw to exit function"
  (interactive)
  (catch ‘aaa
    (if (y-or-n-p "exit?")
	(progn
	  (message "existing")
	  (throw ‘aaa 3) ; if yes, exit right away, return 3 to catch
	  )
      (progn ; else, go on
	(message "went on")
	4 ; return 4
	))))

8 函数与命令

定义函数格式: (defun function_name (param1 param2 …) "doc_string" body)

示例:

(defun myFunction () "testing" (message "Yay!") )

定义命令和定义函数类似,不过要加上 interactive

示例:

(defun yay ()
  "Insert “Yay!” at cursor position."
  (interactive)
  (insert "Yay!"))

命令的参数可为两种,一种是常规参数,一种是emacs特殊参数。

常规参数示例:

(defun myFunction (myArg)
  "Prints the argument"
  (interactive "p")
  (message "Your argument is: %d" myArg)
)

特殊参数示例:

(defun myFunction (myStart myEnd)
  "Prints region start and end positions"
  (interactive "r")
  (message "Region begin at: %d, end at: %d" myStart myEnd)
)

带 interactive 的函数起始就是 execute-extended-command → alt+x

interactive 可带的参数:

格式 含义
(interactive) 无参数命令
(interactive "nWhatisYourAge?") n即参数
(interactive "s") s为string
(interactive "r" r为region,接受首尾作为参数

9 补充: 奇怪的单引号 → `

在配置文件中,我们经常会看到符号 `。

由于在 lisp里, 形式 (op v1 v2)的op为操作数,所以我们如果不想运行,而只是想表达 一个list时,我们就加上符号`。

示例如下:

; assign a list to a var
(setq myList ‘(a b c))

; prints a list
(message "%S" myList)

10 ref

Author: lexnewgate

Created: 2016-04-10 周日 11:46

Emacs 24.5.1 (Org mode 8.2.10)

Validate

elisp 编程基础

标签:

原文地址:http://www.cnblogs.com/AlexWei/p/5373701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!