elisp 编程基础

*/-->

elisp 编程基础

Table of Contents

  • 1. 指令
  • 2. 打印
  • 3. 数学运算
    • 3.1. 加减乘除
    • 3.2. 类型判断
    • 3.3. 字符串与数字转换
  • 4. 逻辑判断
    • 4.1. 真假判断
    • 4.2. 逻辑运算
      • 4.2.1. and 和 or
      • 4.2.2. 数字判断
      • 4.2.3. 字符串判断
      • 4.2.4. equal
  • 5. 变量
    • 5.1. 全局变量
    • 5.2. 局部变量
  • 6. 代码块
  • 7. 遍历
  • 8. 函数与命令
  • 9. 补充: 奇怪的单引号 → `
  • 10. ref

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

时间: 2024-11-05 16:00:43

elisp 编程基础的相关文章

1.5编程基础之循环控制_29:数字反转

/* 1.5编程基础之循环控制 29:数字反转 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个整数,请将该数各个位上数字反转得到一个新数. 新数也应满足整数的常见形式,即除非给定的原数为零, 否则反转后得到的新数的最高位数字不应为零(参见样例2). 输入 输入共 1 行,一个整数N. -1,000,000,000 ≤ N≤ 1,000,000,000. 输出 输出共 1 行,一个整数,表示反转后的新数. 样例输入 样例 #1: 123 样例 #2: -380 样例输出 样

网络编程基础

网络编程基础 1.套接字概念 Linux环境下使用套接字进行进程之间的通信.用过套接字的接口,其他进程的位置对于应用程序来讲是透明的.相互通信双方端点都有一个套接字,双方如果要进行通信,通过套接字建立桥梁,双方就可以通信了. 类似文件一样,套接字也有一个套接字描述符,应用程序可以像操作文件一样操作套接字.在进行网络通信的过程中,用户感觉就是在操作文件一样,这是Linux将外部设备抽象为一个文件的好处. 2.字节序 不同主机的体系结构不同,所采用的数据存储方式不同.网络中,进程之间的通信是跨主机的

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握

shell 脚本编程基础

一.编程基础 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释执行 1.程序的执行方式 计算机:运行二进制指令: 编程语言: 低级:汇编 高级: 编译:高级语言–>编译器–>目标代码 java,C# 解释:高级语言–>解释器–>机器代码 shell, perl, python 2.编程基本概念 编程逻辑处理方式: 顺序执行 循环执行 选择执行 shell编程:过程式.解释执行 编程语言

DAY9:bash脚本编程基础(1)

内容主要为: 一.编程基础 二.shell脚本及其基本格式 三.变量 四.运算 五.条件测试 六.流程控制 一.编程基础 1)程序 程序:指令+数据 程序编程风格: 过程式:以指令为中心,数据服务于指令(C,bash) 对象式:以数据为中心,指令服务于数据 (java,C++,Python) shell程序:提供了编程能力,解释执行 2)程序的执行方式 计算机:运行二进制指令: 编程语言: 低级:汇编 高级: 编译:高级语言-->编译器-->目标代码 java,C# 解释:高级语言-->

iOS开发网络篇—网络编程基础

iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力 (3)如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水 移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据 新闻:网易新闻.新浪新闻.搜狐新闻.腾讯新闻 视频:优酷.百度视频.搜狐视频.爱奇艺视频 音乐

LINQ to XML 编程基础

1.LINQ to XML类 以下的代码演示了如何使用LINQ to XML来快速创建一个xml: 隐藏行号 复制代码 ?创建 XML public static void CreateDocument() { string path = @"d:\website"; XDocument xdoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"), new XEle

Java网络编程基础(六)— 基于TCP的NIO简单聊天系统

在Java网络编程基础(四)中提到了基于Socket的TCP/IP简单聊天系统实现了一个多客户端之间护法消息的简单聊天系统.其服务端采用了多线程来处理多个客户端的消息发送,并转发给目的用户.但是由于它是基于Socket的,因此是阻塞的. 本节我们将通过SocketChannel和ServerSocketChannel来实现同样的功能. 1.客户端输入消息的格式 username:msg    username表示要发送的的用户名,msg为发送内容,以冒号分割 2.实现思路 实现思路与Java网络

LINUX下C语言编程基础

实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理及语法规范 7. 掌握静态库和动态库的生成 二.实验步骤 1. 快捷键 Ubuntu中: 2. vim VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码,即使以后你不编写程序,只要跟文本打交道,都应该学学VIM,可以浏览参考一下普通人