[Lisp] Tutorial

출처 : http://www.cc.gatech.edu/classes/AY2005/cs3600_fall/resources/lispTutorial.html
Simple Lisp Tutorial
Data Structure
List
Example:
‘(a b c d e)
‘(1 2 4 5)
‘((a b) (c d) (1 3))
Array
Array is a list of demensions.
Examples:
>(setq x
(make-array ‘(4 3)
:initial-contents
‘((a b c)
(1 2 3)
(d e f)
(3 1 2))))
#2A ((a b c) (1 2 3) (d e f) (3 1 2))
>(aref x 0 0)
a
>(setq y (make-array 3 :initial-contents ‘(a b c)))
#(a b c)
>(setf (aref y 0) ‘d)
d
>y
#(d b c)
t and nil
t means true in Lisp.
nil means false in Lisp.
Functions
(functionName arg1 � arg 2)
Functions to control list
[function]: car, cdr
car: return the first element of a list
cdr: return the tail of a list
Example:
>(setq x �(a b c))
(a b c)
>(car x)
a
>(cdr x)
(b c)
[function]: cons
cons is the primitive function to create a new cons whose car is x and whose cdr is y. For example:
Examples:
(cons ‘a ‘b) => (a . b)
(cons ‘a (cons ‘b (cons ‘c ‘()))) => (a b c)
(cons ‘a ‘(b c d)) => (a b c d)
[function]: nth
cons returns the nth element of list
Examples:
(nth 0 ‘(foo bar gack)) => foo
(nth 1 ‘(foo bar gack)) => bar
(nth 3 ‘(foo bar gack)) => ()
[function]: list
list constructs and returns a list of its arguments. For example:
Examples:
(list 3 4 ‘a (car ‘(b . c)) (+ 6 -2)) => (3 4 a b 4)
(list) => ()
(list (list ‘a ‘b) (list ‘c ‘d ‘e)) => ((a b) (c d e))
[function]: mapcar
mapcar operates on successive elements of the lists.
Examples:
>(mapcar #’+ ‘(1 2 3) ‘(4 5 6))
(5 7 9)
Control Functions� Do, While, Repeat, if, cond
[function]: Do
Example:
>(setq i 3)
>(do ((i 1 (+ 1 i)))
((> i 5))
(print i))
1
2
3
4
5
[function]: if
if test then [else]
Example:
>(setq x 3)
>(if (= x 3) (print “x is equal to 3”) (print “x is unequal to 3”))
x is equal to 3
[function]: cond
A cond form has a number (possibly zero) of clauses, which are lists of forms. Each clause consists of a test followed by zero or more consequents.
(cond (test-1 consequent-1-1 consequent-1-2 …)
(test-2)
(test-3 consequent-3-1 …)
… )
Example:
>(setq a 5)
>(cond
((evenp a) a) ;if a is even return a
((> a 7) (/ a 2)) ;else if a is bigger than 7 return a/2
((< a 5) (- a 1)) ;else if a is smaller than 5 return a-1 (t 17)) 17 Predicate and Equality (predicate arg) [function]: null [function]: listp [function]: intp [function]: floatp Example: >(setq x ‘a)
>(cond
((null x) (print “x is null”))
((listp x) (print “x is a list”))
((atom x) (print “x is an atom”))
((floatp x) (print “x is float”)))
x is an atom
[function]: =
= denote numerical euqality.
[function]: eq
eq denote two symbols’ equality.
[function]: equal
Two copies of the same list are not eq, but they are equal.
Examples:
> (eq ‘a ‘a)
T
> (eq ‘a ‘b)
NIL
> (= 3 3)
T
> (= 3 4)
NIL
> (eq ‘(a b c) ‘(a b c))
NIL
> (equal ‘(a b c) ‘(a b c))
T
Output functions
[function]: print
[function]: format
Examples:
>(print “hello world”)
hello world
>(setq x 2)
(format t “x = ~s ~%” x)
2
functions and misc
[function]: let
A let form can be used to execute a series of forms with specified variables bound to specified values. It can be used to specify the local variables
(let ((var1 value1)
(var2 value2)

(varm valuem))
body1
body2

bodyn)

Examples:
>(defun lisp-let (a)
(print a)
(let
((a 4))
(print a)))
>(lisp-let 5)
5
4

[function]: progn & prog1
progn{form}* :
progn 구조는 왼쪽에서 오른쪽으로 순서대로 순차적으로 실행하고 숫자의 형태를 가집니다. 마지막 값은 버려지게 됩니다.

prog1 first {form}*:
그에 반해 prog1 progn과 비슷하지만 첫번째 폼에서의 값을 반환합니다.

Examples:
[code]
>(setq x 3)
3
>(progn
(setq x 5)
(+ x 3))
8
>(prog1
(setq x 5)
(+ x 3))
5
[/code]
Self-defined Functions
Example:
>(defun printString (a)
(print t a))
ps
>(printString ‘(a b c))
(a b c)
Debug Functions
[function] :zoom
[function] :zoom :verbose t
Useful Link
• A one-page summary of the most basic Lisp constructs
• Lisp index reference

[Clojure] emacs+lein+swank

아래는 emacs에서 lein과 swank를 이용한 프로젝트 생성과 사용법을 설명 합니다.

– clojure는 lisp의 영향을 받은 자바 가상머신 위에서 동작하는 언어입니다.
– emacs는 하나의 에디터가 아닌 플렛폼이라고 불린 만큼 강력한 툴이라고 불리고 있습니다.
– lein은 자바 라이브러리 사용 할 수있도록 도와줍니다.
– swank는 emacs에서 인터리프리터 된 반환을 표시해주는 server역할을 합니다.

프로젝트 생성
[code]
lein new <project name>
[/code]

lein 의존성 라이브러리 추가하기
프로젝트 디렉토리 안 proejct.clj파일에 아래와 같이 변경합니다.
[code]
(defproject iGAS "1.0.0-SNAPSHOT"
:description "i-GAS Development"
:dependencies [[org.clojure/clojure "1.2.0-beta1"]
[org.clojure/clojure-contrib "1.2.0-beta1"]
[incanter "1.2.3"]
[swingrepl "1.0.0-SNAPSHOT"]]
:dev-dependencies [[lein-clojars "0.5.0-SNAPSHOT"]
[swank-clojure "1.2.1"]
[jline "0.9.94"]])
[/code]

lein 의존성 라이브러리 가져오기
[code]
lein deps
[/code]

repl모드로 시작하기 (emacs가 아닌 콘설창에서 개발하기)
[code]
lein repl
[/code]

emacs에서 개발하기
[code]
lein swank
[/code]
위와 같이 실행을 하며 로컬호스트에 4005포트가 열리게 되며 emacs에서 slime-connect로 접속하여 개발하시면 됩니다.

[개발 팁]
다른 라이브러리를 사용할려면 /lib폴더에 jar파일을 넣어주시면 됩니다.

//==== 번외편 ====//
slime을 설치하여 slime 커넥션으로 swank에 붙는다. 이상.

[Lisp] restart…

2010. 11. 10
Emacs 브라우저 확장하기.
설치 순서는 아래와 같다.
cedet 링크
ecb 링크
– ecb(Emacs Code Browser)를 설치할 때에는 Makefile에서 경로를 재설정 해주어야한다.

2010. 11. 09
emacs에서 확장하기 new 버전을 받고 emacs를 돌리게 되면 에러가 발생한다.
이유는 리눅스계열에서 제공하는 패키지가 따로 존재하지 않기때문이다.
따로 복사해서 넣어 패스를 잡아주도록 하자.
emacs-goodies-el download link.
loading meacs library
emacs 확장하기http://kldp.org/node/96363
라이브러리 :http://www.emacswiki.org/emacs/

기초 문법  : http://emacs.kldp.net/wiki/doku.php?id=emacslisp:xah_lee_tutorial_01

간단한 문자열을 찍어보자.

선택 된 영역 실행 X-x eval-region

수식의 맽끝에서 실행 X-x eval-last-sexp

입력되는 명령어의 결과를 바로 확인 할 수 있는 ielm 모드로 변경

M-x ielm

다시 작성해야겠다. 젠장..

//———————————————————

다음 화면으로 이동 C-v

이전 화면으로 이동 M-v

현재 커서를 기준으로 화면 위치를 바꿈 (맨위, 가운데, 맨아래) C-l

//———————————————————

위로 C-p

아래로 C-n

뒤로 C-b

앞으로 C-f

//———————————————————

한단어 앞으로 M-f

한단어 뒤로 M-b

문장 앞으로 C-a

문장 뒤로 C-e

앞 문장 앞으로 M-a

뒤 문장 뒤로 M-e

소스 맨 앞으로 M-<

소스 맨 뒤로 M->

//———————————————————

반복 C-u 8 C-f // C-f 명령어를 8번 반복한다.

//———————————————————

실행 취소 C-g

//———————————————————

명령어 비활성화 C-x C-l (which is a disabled command) // 비활성화 할 명령

화면 분활 C-x 1 // 뒤에는 화면을 분활 할 인자가 들어간다.

//———————————————————

앞에 한문자 지우기 <Delback>

뒤에 한문자 지우기 C-d

앞 한 단어 지우기 M-<Delback>

뒤에 한단어 지우기 C-d

현재 위치에서의 한문장 지우기 C-k

현재 위치에서 다음문장까지 지우기 M-k

//———————————————————

영역 설정하기 C-@, C-<SPC>

영역 지우기 C-w

끌어당기기(yanking) C-y

되돌리기(undo) C-x u , C-_

//———————————————————

파일열기(생성) C-x C-f

저장하기 C-x C-s

버퍼 리스트 불러오기 C-x C-b

버퍼 전환하기 C-x b *message* // 파일도 가능하면 버퍼도 가능하다.

//———————————————————

명령어 확장하기 사용해보지는 않았음.

C-x

Character eXtend. Followed by one character.

M-x

Named command eXtend. Followed by a long name.

//———————————————————

찾아바꾸기 M-x repl s

되살리기(recover) M-x recover-file

모드 바꾸기 M-x text-mode

오토 필 모드로 전환하기 M-x auto-fill-mode

//———————————————————

유용한 명령어 마진 바꾸기 C-u 20 C-x f

마진 적용하기 M-q

//———————————————————

앞으로 검색하기 C-s

뒤로 검색하기 C-r

//———————————————————

메뉴얼 보기 C-h m

현재 화면 포커스 이동하기 C-x o

아래화면 아래로 스크롤하기 C-M-v

//———————————————————

새로운 창 열기 M-x make-frame

현재 선택된  창 죽이기 M-x delete-frame

단축 설명 보기 C-h c C-p //  C-p에 대한 설명을 기술한다.

단축 설명 보기 창으로 이동 C-h k C-p // 새로운 창으로 이동한다.

앞 Char로 설명 찾기 C-h f

단어로 설명 찾기 C-h a

파일 추가하기 C-x i

//———————————————————

2시간에 걸쳐 쓴 내용이 다날라갔지만 다행이도 머리에 남아있어 다시 쳤다.

저장하는 습관을 기르자 아자.

2010-11-08 14:45

한 1년 전 쯤이였나,, 해피해킹 키보드를 구매하면서 처음 Emacs를 잠깐 접해보았다.

대략 8개월 동안 사용했으나, 손가락 배치가 너무 불편하여 vi로 옴겼으나 시간이 갈수록 Emacs가 그리워졌다.

그래서 결국 다시 Emacs를 배울려고 한다. 더불어 Lisp도 함께…

잘 사용하면 좋지 않을까 하는 기대를 해본다.

오랜만에 Emacs와 Lisp에 대한 검색을 했다. 찾아보니 모임도 있고 대략 배우기에 부족하지 않을 만큼에 자료들이

검색 되었다.

첫째로

Lisp을 좋아하는 사람들의 그룹 (http://groups.google.com/group/lisp-korea) 이 있었고 또한

장선진님의 블러그 (http://blog.java2game.com/247) 또한 내용이 있었던것 같다.

이 내용을 바탕으로 다시 한번 배워볼려고 한다.

그리고 왠만하면 이제는 자료를 공유할 생각이다.

아자아자. 되게 기대되넹? 아자!!