Programming/lisp2012. 1. 24. 18:07
연휴이고 하니 뜬금없이 LISP 공부중인데 전에도 이해 못했고 이번에도 이해 못하고 있는 lisp -_-
LISP는 LISt Process 의 약자로
이름대로 모든것으로 LIST 에 기반하여 표현하게 되며, 리스트는 () 로 둘러쌓여 표현된다.
이러한 이유로 lisp 소스를 보면 ()가 가득히 둘러쌓여 가독성이 떨어지는 형태가 된다.

또한 리스트에서 계산등은 모두 전위표기법을 사용하게 되며 기본 연산은 다음과 같이 표현된다.
CL-USER> (+ 1 2 ) ; 1 + 2
3
 
CL-USER> (- 1 2 ) ; 1 - 2
-1
 
CL-USER> (/ 1 2) ; 1 / 2
1/2
 
CL-USER> (* 1 2) ; 1 * 2
2
 
CL-USER> (mod 3 2) ; 3 % 2
1
 
CL-USER> (log 2) ; log(2)
0.6931472
 
CL-USER> (sqrt 2) ; sqrt(2)
1.4142135 

CL-USER> (< 1 2) ; 1 < 2
T 

그리고 기호를 가지는 변수(?)는 setq 명령어를 이용하여 선언한다. 
val을 입력하면 해석할 수 없는 변수이기 때문에 에러가 나지만 setq를 통해서 값을 정해주면
val만 입력해도 입력했던 값이 나오게 된다.
CL-USER> val
Invoking restart: Return to sldb level 2.
; Evaluation aborted on #<UNBOUND-VARIABLE #xC7B642E>.

CL-USER>
(setq val 100)
100

CL-USER> val
100 

CL-USER> (setq str "This is test string")
"This is test string"
 
CL-USER> str
"This is test string" 
 
아무튼 defvar 라는 키워드를 이용해서 변수를 선언 할수도 있는데 setq와는 다르게 리턴되는 값이 다르다
CL-USER> (defvar loop 10)
LOOP
 
CL-USER> loop
10 
 
함수는 defun (DEFine + FUNction 인 듯?)을 통해서 선언이 가능하다.
단순하게 3을 리턴하는 함수로 three 라는 것을 만드는 예제이다.
> (defun three () 3)            
THREE                           

> (three)                       
3                               

> (+ (three) 1)                 
4          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> three()                       
error: unbound variable - THREE 
> three                         
error: unbound variable - THREE 
> (+ three 1)                   
error: unbound variable - THREE  
 
인자를 사용하는 함수로 인자는 아래와 같이 사용한다.
CL-USER> (defun add (x y) (+ x y))
ADD

CL-USER> (add 3 4)
7 
 
리스트는 아래와 같이 '을 먼저 찍고 해주면 된다. (아직 이해 부족.. OTL)
물론 리스트도 setq로 선언하여 사용이 가능하다.
> '(1 2 3)             
(1 2 3)                

> (1 2 3)              
error: bad function - 1 

'/어포스트로피/apostrophe
'foo는 (quote foo) 와 동일하고 s expression 에서 함수가 아닌 것으로 해석하도록 하는 명령어이다.
어떻게 보면 변수로 인식시킨다고 해야 하려나? replace 라고 된것을 보면 -_-

Creating sets (actually, creating variables) can be done with setf : this creates a set called learned with three members:

(setf learned '(VB C++ LISP))

The apostrophe is uses to designate that something in brackets isn't a function (or an S-expression). Basically, if LISP receives something like (VB C++ LISP) it assumes VB is the name of a function and C++ and LISP are its arguments. The apostrophe says that this isn't a function, it's a list, and can itself be an argument in a function.

[링크 : http://homepages.paradise.net.nz/milhous/lisp.htm]  

The form 'foo is simply a faster way to type the special form

(quote foo)

which is to say, "do not evaluate the name foo and replace it with its value; I really mean the name foo".

I think SISC is perfectly fine for exploring the exercises in TLS. 

[링크 : http://stackoverflow.com/questions/1539144/what-is-apostrophe-in-lisp-scheme]  





리스프에 내장된 함수라고 해야하나 keyword 라고 해야하나 아무튼 그거 목록
[링크 : http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/] << 목록
    [링크: http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/clm.html] << 최상위

'Programming > lisp' 카테고리의 다른 글

lisp는 리스트지 prefix 표기법이 아니다  (0) 2012.11.19
lisp 관련 책  (0) 2012.01.25
slime / lispbox  (0) 2012.01.24
우분투에서 lisp 설치하기  (0) 2012.01.15
lisp  (0) 2011.05.05
Posted by 구차니