프로그래밍 Better Programming/리스프 LISP
우분투 14.04에 PostgreSQL 설치하기 How To Install and Use PostgreSQL on Ubuntu 14.04
2017. 11. 18.How To Install and Use PostgreSQL on Ubuntu 14.04 Installation우분투의 기본 저장소는 Postgres 패키지를 포함하고 있으므로, apt 패키징 시스템을 이용해서 설치할 수 있다. 로컬 apt 저장소를 업데이트하지 않았으므로, 먼저 apt 저장소를 업데이트한다. Postgres 패키지와 "contrib" 패키지를 가지고 와서 설치한다.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596..
Getting Started with CLISP (17) - 텍스트 출력 및 읽기 Printing and Reading Text
2017. 11. 4.Getting Started with CLISP (17) - 텍스트 출력 및 읽기 Printing and Reading Text 이번 포스팅에서는 사용자 인터페이스의 가장 기본인 command-line 인터페이스에 대해서 알아본다. Printing and Reading Text스크린에 프린트하기1234567 Break 83 [84]> (print "foo") "foo""foo"Break 83 [84]> cs"foo"가 2번 출력이 된다. 첫번째 "foo"는 실제 print 함수가 출력하는 부분이며, 두번째 "foo" 는 REPL이 입력된 표현식의 값을 그대로 출력해주기 때문이다. 숙련된 리스퍼들은 prin1 함수도 애용한다. print 와 prin1 의 차이점을 이해하기 위해 다음의 예를 살펴보자.123..
Getting Started with CLISP (16) - 텍스트 게임 엔진 만들기 Building a text game engine
2017. 11. 2.Getting Started with CLISP (16)텍스트 게임 엔진 만들기 Building a text game engine 텍스트 기반의 게임 엔진을 만들어보자. 본 프로그램에서는 다음의 몇 가지를 다룰 수 있어야 한다. 1. 둘러보기2. 다른 장소로 이동하기3. 물건 집기4. 집은 물체에 대한 행동 먼저 1. 주변을 둘러보는 것과 관련해서, 어떤 위치에서든 서로 다른 3가지를 "볼" 수 있어야 한다. 1. 기본 경관2. 다른 위치로 가는 하나 이상의 경로3. 집어서 조작할 수 있는 물건 Describing the Scenery with an Association List본 예제에서는 3개의 위치만 포함하고 있다. 먼저 위치를 나타내는 최상위 변수 nodes 를 선언해보자. 1234[32]> (d..
Getting Started with CLISP (15) - Comparing Stuff: eq, equal, and More
2017. 10. 26.먼저 심볼간의 비교에는 eq 를 사용한다.1234[12]> (defparameter *fruit* 'apple)*FRUIT*[12]> (cond ((eq *fruit* 'apple) 'its-an-apple))ITS-AN-APPLEColored by Color Scriptercs 2개의 심볼을 비교하는 게 아니라면 equal 을 사용해라. 이 명령어는 서로 동형인지를 판단해준다. 1) 심볼 및 리스트 비교1234[13]> (equal 'apple 'apple)T[13]> (equal (list 1 2 3) (list 1 2 3))TColored by Color Scriptercs2) 다른 방식으로 생성된 리스트 간 비교도 가능1234Break 26 [27]> (cons 1 (cons 2 (cons 3 (..
Getting Started with CLISP (14) - Cool Tricks with Conditions
2017. 10. 25.Cool Tricks with Conditions리스프의 몇 가지 반직관적인 트릭을 통해 우리는 좀 더 간결한 코드를 작성할 수 있게 해준다. 하나는 2개의 새로운 조건문 명령어이고, 다른 하나는 True와 False 에 대한 리스프만의 심플한 컨셉이다. Using the Stealth Conditionals and and orand와 or 조건은 간단한 수학 연산자로 Boolean 연산을 도와준다. 예를 들면 다음과 같이 3개의 숫자가 모두 홀수인 경우에 T를 반환하는 것처럼 말이다. 12[75]> (and (oddp 5)(oddp 7)(oddp 9))TColored by Color Scriptercsor 를 이용하면 아래와 같이 하나만 홀수라도 T 를 반환한다.12[76]> (or (oddp 4) (..
Getting Started with CLISP (13) - 조건문 The Conditionals: if and Beyond
2017. 9. 19.The Conditionals: if and Beyondtrue 나 false 에 따라 서로 다른 값이 반환되도록 할 때 if 를 사용한다.1234[57]> (if (= (+ 1 2) 3) 'yup 'nope)YUP [57]>(if (= (+ 1 2) 4) 'yup 'nope)NOPEColored by Color Scriptercs물론 리스트가 비었는지 체크할 때도 사용할 수 있다.1234[58]> (if '(1) 'the-list-has-stuff-in-it 'the-list-is-empty)THE-LIST-HAS-STUFF-IN-IT[58]> (if '() 'the-list-has-stuff-in-it 'the-list-is-empty)THE-LIST-IS-EMPTYColored by Color Sc..
Getting Started with CLISP (12) - nil 과 ()
2017. 9. 16.The Symmetry of nil and ()리스프의 명령어와 데이터 구조의 동작을 자세히 보면 리스프는 대칭이라는 정신으로 똘똘 뭉쳐있는 것으로 보인다. 이러한 대칭성이야말로 리스프 코드를 우아하게 만들어 주고, 리스프의 간결한 구문 역시 이러한 대칭이 가능하게 하는 중요한 요소 중 하나가 된다. Empty Equals False정보를 저장하고 가공하는데 있어 리스트의 효용을 아주 강조하는 리스프의 철학상 리스트를 나누는데 편리한 디자인을 선호하는 것은 당연한 이치일 것이다. 가장 심오한 결정 중의 하나는 리스트에 관해 비어있는 리스트를 false 로 평가한다는 것이다. 1234[49]> (if '() 'i-am-true 'i-am-false)I-AM-FALSE[49]> (if '(1) 'i-am-t..
Getting Started with CLISP (11) - 중첩리스트 Nested Lists
2017. 9. 16.Nested Lists리스트는 리스트를 포함할 수 있다. 예를 들면 다음과 같다. 이 경우 3개의 아이템을 가진 리스트가 된다. 두 번째 아이템은 (duck bat) 으로 그 자체가 리스트이다. 12[42]> '(cat (duck bat) ant)(CAT (DUCK BAT) ANT)cs중첩리스트도 콘셀을 이용해서 구성된 것이며, 앞서 언급한 리스트 함수들을 이용하여 아래와 같이 원하는 아이템을 추출해낼 수 있다.123456[43]> (car '((peas carrots tomatoes)(pork beef chicken)))(PEAS CARROTS TOMATOES)[43]> (cdr '(peas carrots tomatoes))(CARROTS TOMATOES)[43]> (cdar '((peas carrot..
Getting Started with CLISP (10) - Car, Cdr, List Function
2017. 9. 16.The car and cdr Functions리스트는 2개의 아이템으로 구성된 셀의 긴 체인과도 같다. car 함수는 셀에서 첫 번째 아이템을 꺼낼 때 사용된다. 12[33]> (car '(pork beef chicken))PORKcs이에 반해 cdr 함수는 리스트의 첫 번째 아이템을 제거한다.12[35]> (cdr '(prok beef chicken))(BEEF CHICKEN)cs그리고 car 과 cdr 을 결합하여 cadr, cdar, cadadr 같은 함수를 만들어낼 수도 있다. cadr 의 경우 car 와 cdr 을 동시에 쓰는 것과 같다. cadr 의 경우 리스트의 두 번째 아이템을 뽑아낸다. 다음의 예를 보자. 123456[37]> (cadr '(pork beef chicken))BEEF[37..
Getting Started with CLISP (9) - Cons Function
2017. 9. 16.List Functions리스트를 다루는 것은 리스프 프로그래밍에서 *아주* 중요한 부분이다. 리스프에서 콘셀을 다루는데는 cons, car, cdr 이라는 3가지 기본 함수가 있다. The cons Function타입과는 무관하게 2개의 데이터를 연결할 경우, 주로 쓰는 방법이 cons 함수를 통한 것이다. 예를 들어, chicken 을 cat 에 연결해보자. 12[26]> (cons 'chicken 'cat)(CHICKEN . CAT)cs보는 바와 같이 cons 은 괄호안의 점으로 각각의 아이템을 연결한 하나의 객체를 반환한다. 이것은 일반적인 리스트와는 다르다. 가운데 있는 점을 통해 2개의 아이템을 연결하는 콘셀을 만드는 것이다. 그리고 quoting 을 통해 2개의 아이템을 리스프가 코드가 아닌..
Getting Started with CLISP (8) - 콘셀(Cons Cells)
2017. 9. 16.리스트는 리스트의 핵심 기능이다. 간단한 리스프 코드를 보자. 아래 코드는 심볼 (expt)와 2개의 숫자로 구성되어 있으며 괄호로 표시되는 리스트에 포함되어 있다.12[23]> (expt 2 3)8cs Cons Cells리스프의 리스트는 cons cells(이하 콘셀로 명명) 에 의해 결합된다. 콘셀은 2개의 작은 연결된 박스로 구성되며, 각각은 서로 다른 것을 가리킨다. 서로 다른 2개를 가리킬 수 있기 때문에 콘셀을 연결하셩 리스트에 넣는 것이 가능하다. 사실 리스프는 모든 것이 콘셀로 구성된 추상적인 구조에 불과하다. 예를 들어, '(1 2 3) 이라는 리스트를 만들었다고 하자. 컴퓨터 메모리에는 다음과 같이 표현된다. 3개의 콘셀을 통해 구성되는데, 각각의 셀 중 하나는 숫자를 그리고 나머지 하..
Getting Started with CLISP (7) - 리스프는 코드와 데이터를 어떻게 구분하는가 How Lisp Distinguishes Between Code and Data
2017. 9. 15.리스프에서는 코드와 데이터를 어떻게 구분하는가? 이를 위해 Common Lisp 는 2개의 모드를 사용한다. 하나는 코드 모드이고, 다른 하나는 데이터 모드이다. Code Mode무언가를 Lisp REPL 에 입력할 때마다 컴파일러는 여러분이 실행하고자하는명령을 입력하고 있다고 간주한다. 다른 말로 하면, 리스프는 기본 모드가 코드 모드라는 얘기다. 이미 언급했지만, 리스프는 코드가 리스트 형태로 입력된다고 기대한다. 하지만 입력되는 코드는 리스트의 특별한 타입, 즉 폼의 형태이다. 폼이라는 것은 도입부에 특별한 명령(보통은 명령의 이름)을 가지는 리스트를 말한다. 폼을 읽을 때 리스프는 해당 리스트의 모든 아이템을 파라메터로 함수에게 보낸다. 12[19]> (expt 2 3)8cs위의 예에서 지수를 계..
Getting Started with CLISP (6) - Symbols, Numbers, Strings
2017. 9. 15.Symbols리스프의 심볼은 문자, 숫자, + - / * = < > ? ! _ 와 같은 특수문자로 구성된다. 예를 들면 다음과 같다. foo, ice9, my-killer-app27, and even ---- 리스프의 심볼은 대소문자를 구별하지 않는다(case-insensitive). 하지만 대부분의 리스퍼들은 대문자를 사용하지 않는다. 이는 다음과 같이 2개의 심볼을 비교해보면 알 수 있는데, 리스프는 아래의 2개의 심볼을 동일한 것으로 취급한다.12[1]> (eq 'fooo 'FoOo)Tcs Numbers리스프는 실수와 정수를 모두 지원한다. 소수점 여부에 따라 정수 또는 실수로 구분된다. 리스프에서 1 과 1.0 은 서로 다른 2개의 개체인 셈이다. 그리고 다음과 같이 1 과 1.0을 더하는 경우,..
Getting Started with CLISP (5) - 로컬 함수 정의하기 Defining Local Functions in Lisp
2017. 9. 8.Defining Local Functions in Lispflet 명령을 이용하여 로컬 함수를 만들 수 있다. 함수 선언은 함수명, 인수, 그리고 함수 본문으로 구성된다. 예를 들면 다음과 같다. 12[1]> (flet ((f (n) (+ n 10))) (f 5))15Colored by Color Scriptercs예제에서는 하나의 인수 n 을 갖는 함수 f 를 정의했다. 함수 f 는 변수 n 에 10을 더한다. 그리고 5를 인수로 해당 함수에 집어넣으면 보는대로 15가 결과값으로 반환된다. let 을 이용하여 flet 의 범위내에 하나 이상의 함수를 정의할 수 있다. 그리고 하나의 flet 을 통해 다수의 로컬 함수를 다음과 같이 선언할 수 있다.123456[4]> (flet ((f (n) (+ n 1..
Getting Started with CLISP (4) - 전역함수 정의학기 (2)
2017. 9. 8.Defining the smaller and bigger Functionssmaller 함수와 bigger 함수를 작성해보자. 이 함수들은 guess-my-number 함수와 마찬가지로, defun 으로 정의되는 전역 함수이다. 12345678[7]> (defun smaller() (setf *big* (1- (guess-my-number))) (guess-my-number))SMALLER[8]> (defun bigger() (setf *small* (1+ (guess-my-number))) (guess-my-number))BIGGERColored by Color Scriptercs 라인1에서 smaller 함수는 파라메터가 없기 때문에 smaller() 와 같이 괄호 안이 비어있다. 그리고나서 전역변수..
Getting Started with CLISP (3) - 전역함수 정의하기 (1)
2017. 9. 7.전역 함수 정의하기사용자가 입력한 값이 정답보다 큰지 작은지에 따라 반응을 내보내는 guess-my-number 라는 게임에는 guess-my-number, smaller, 그리고 bigger 라는 3개의 전역 함수가 필요하다. 그리고 초기값을 정의할 start-over 함수도 필요하다. Common Lisp 에서 함수는 defun 이라는 함수를 통해 정의한다. 먼저 함수의 이름과 인수를 정의해보자.첫번째로 정의해야할 함수는 guess-my-number 이다. 이 함수는 사용자의 추측을 이끌어내기 위해 *big* 과 *small* 변수를 사용한다. 다음과 같다. 함수이름 뒤에 위치한 ( ) 는 요구되는 파라메터가 없다는 표시이다. 12345[1]> (defun guess-my-name () (ash (+..
Getting Started with CLISP (2) - 전역변수 정의 및 리스프 코딩 에티켓 Defining Global Variables in Lisp and Basic Lisp Etiquette
2017. 9. 6.전역 변수 정의하기LISP에서 전역 변수는 다음과 같이 설정합니다. 예를 들어 상한과 하한을 나타내는 small 과 big 변수를 정의해보겠습니다. 리스프에서 전역으로 정의된 변수를 top-level definition 이라고 부르는데요. 다음과 같이 defparameter 함수를 이용해서 top-level definition 을 정의할 수 있습니다. 123456789101112[1]> (defparameter *small* 1)*SMALL*[2]> (defparameter *big* 100)*BIG*[3]> *small*1[4]> *big*100[5]> (defparameter *big* 1000)*BIG*[6]> *big*1000cs defparameter 라는 함수이름은 parameter 와는 사실..
Getting Started with CLISP (1) - CLISP 설치, 실행, 종료
2017. 9. 6.1. 가상환경구축123456789101112root@localhost:~# mkdir lispworksroot@localhost:~# cd lispworksroot@localhost:~/lispworks# virtualenv -p python3 venvRunning virtualenv with interpreter /usr/bin/python3Using base prefix '/usr'New python executable in /root/lispworks/venv/bin/python3Also creating executable in /root/lispworks/venv/bin/pythonInstalling setuptools, pip, wheel...done.root@localhost:~/lispwor..
리스프 리스트 데이터 타입 Common Lisp: LIST - the most versatile data type (3)
2017. 4. 24.Common Lisp: LIST - the most versatile data type (3) Designed by Freepik 1. 리스트 리스트 함수는 새로운 NIL로 끝나는 cons cell 체인을 만든다. CONS는새로운 단일의 cons cell 을 만든다는 것에 비추어보면, 두 번째 입력이 위치한 리스트에 첫 번째 입력을 더하는 것이다. 리스트 함수는 완전히 새로운 cons cell 체인을 만드는 것이다. 괄호 표기법으로 보자면, 그 결과 리스트 함수는 입력이 갖고 있는 것보다는 한 단계 더 많은 괄호를 가지게 된다. 1) 리스트는 새로운 3개의 cons cells을 할당한다. FOO BAR BAZ 2) CAR 포인터를 채운다. ● ● ● ↓ ↓ ↓ FOO BAR BAZ 3) CDR 포인터를 ..
LISP - CAR/CDR Pronunciation Guide
2017. 4. 24.Common Lisp: LIST - CAR/CDR Pronunciation Guide Designed by Freepik LISP - CAR/CDR Pronunciation Guide Function Pronunciation Alternate Name CAR kar FIRST CDR cou-der REST CAAR ka-ar CADR kae-der SECOND CDAR cou-dar CDDR cou-dih-der CAAAR ka-a-ar CAADR ka-ae-der CADAR ka-dar CADDR ka-dih-der THIRD CDAAR cou-da-ar CDADR cou-dae-der CDDAR cou-dih-dar CDDDR cou-did-dih-der CADDDR ka-dih-dih-der FOU..
리스프 리스트 데이터 타입 Common Lisp: LIST - the most versatile data type (2)
2017. 4. 24.Common Lisp: LIST - the most versatile data type (2) Designed by Freepik 1. CAR 과 CDRcons cell의 두 부분은 모호한 이름을 가지고 있는데, 좌측 절반은 CAR, 그리고 우측 절반은 CDR (‘‘cou-der,’’라고 발음한다) 라고 불린다. CAR 라는 명칭은 Contents of Address portion of Register를 의미하고, CDR은 Contents of Decrement portion of Register를 의미한다. 이런 용어가 현대 컴퓨터 하드웨어에는 적합하지는 않지만 Common Lisp 에서는 여전히 cons cells 을 언급할 때 CAR와 CDR이라는 축약어를 사용한다. 역사적인 이유도 있지만, 일부는..
리스프 리스트 데이터 타입 Common Lisp: LIST - the most versatile data type (1)
2017. 4. 22.Common Lisp: LIST - the most versatile data type (1) Designed by Freepik Lisp’라는 언어의 이름이 List Processor 에서 온 것처럼 리스트는 중심적인 데이터 타입으로, 다용도의 데이터 타입이다. 앞으로 몇 차례에 걸쳐 리스프의 리스트 데이터 타입에 대해 알아본다. 1. 리스트의 표현방식리스트는 출력형과 내부형 2가지 형태로 표현될 수 있다. 출력형에서 리스트는 괄호 안에 포함된 아이템의 묶음을 의미한다. 그리고 그 아이템은 리스트의 원소라고 부른다. 몇 가지 예를 살펴보면 다음과 같다. (RED GREEN BLUE) (AARDVARK) (2 3 5 7 11 13 17) (3 FRENCH HENS 2 TURTLE DOVES 1 PARTR..