common lisp
-
언어별 형식 출력 함수 비교Programmer/Programming 2021. 7. 9. 12:50
언어별 형식 출력 함수와 형식 변환 지정자 C Go C++ fmt Rust Python Javascript ES6 Template literals Common Lisp 표준출력 printf( "%d", 3) fmt.Printf( "%d", 3) fmt.print( "{}", 3) print!( "{}", 3) print( "{}".format(3)) let n = 3; console.log( `${n}`) (format t "~d" 3) 파일출력 fprintf( fh, "%d", 3) fmt.Fprintf( fh, "%d", 3) fmt.print( fh, "{}", 3) write!( fh, "{}", 3) print( "{}".format(3), file = fh) let n = 3; fs.write..
-
러스트와 다른 언어의 멀티라인 처리 비교Programmer/Programming 2019. 2. 12. 14:38
새줄문자가 들어간 스트링 리터럴 출력 Rust fn main() { println!("In the rooom the women come and go, Singing of Mount Abora"); } 결과 : 스트링 리터럴의 새줄문자와 공백문자를 그대로 출력 In the rooom the women come and go, Singing of Mount Abora C #include int main() { printf("In the rooom the women come and go, Singing of Mount Abora"); putchar('\n'); } 결과 : 빌드 실패 cc -Wall -O2 -o prt_nl_str prt_nl_str.c prt_nl_str.c:5:12: warning: miss..
-
Lisp 비교 : Emacs의 개발 환경Programmer/Emacs 2017. 7. 11. 03:36
Emacs의 Programming 관련 공통 설정 Lisp 공통 설정 (use-package paredit :ensure t :diminish paredit-mode :init (use-package paredit-everywhere :ensure t)) Common Lisp Common Lisp의 major-mode는 'lisp-mode'이다. 보통 확장자 '*.lisp'나 '*.l'와 연결되어 있다. SLIME이라는 강력한 REPL 도구가 있다. Common Lisp 설정 예: (add-hook 'lisp-mode-hook (lambda () (setq indent-tabs-mode nil) (paredit-mode t) (helm-gtags-mode 1))) (use-package slime :en..
-
Common Lisp으로 구현한 트리(Tree)를 중위 순회(In-order Traversal)하는 반복자(Iterator)Programmer/Programming 2016. 5. 17. 15:02
사소해 보이는 연산 뒤에 숨어있는 것 은 인턴 전화 면접에서 깨달은 내용을 담고 있다. 이 글은 인턴 면접을 소재로 하는데, 면접의 내용 중에 트리(Tree)를 중위 순회(Inorder Traversal)하는 반복자를 구현하는 것이 있다. 이 글의 필자는 C++로 구현하였다. 평소 업무에서 Common Lisp을 쓸 기회가 없어서 자꾸 잊어버린다. 도구를 갈고 닦지 않으면 녹슬기 마련이다. 간단하게 트리의 중위 순회를 Common Lisp으로 작성해봤다. 순회 순서 왼쪽의 하위 트리를 순회한다. 자신(중간) 오른쪽의 하위 트리를 순회한다. 순회할 첫번째 노드 구하기 : begin 최상위 노드의 가장 왼쪽에 있는 노드가 첫번째 노드이다. 구현은 왼쪽 하위 노드를 재귀적으로 찾는다. (defun begin ..
-
리스프 개발 팁: 명령창 결과 저장하기Programmer/Programming 2014. 6. 27. 10:38
리스프에서 개발하기 가장 좋은 도구는 REPL 명령창이다. 따라서 저장할 내용을 표준 출력으로 보내면 개발이 수월할 것이다. 예를 들어, 당신은 `MY-SAVE' 함수를 개발하고 있다. 이 함수는 인자 `FNAME'으로 받은 파일명에 당신의 데이타를 저장한다. 개발 과정에서 수시로 파일을 열어서 내용을 확인해야 한다. 불편하다. REPL 명령창에 저장할 내용을 바로 확인하면 개발이 훨씬 편하겠다. 데이타를 저장할 형태로 가공하여 REPL 표준 출력하는 함수 `MY-WRITE'를 작성하자. 이 함수의 구현과 검증은 REPL을 벗어날 필요가 없다. 이제 함수 `MY-SAVE'는 단지 표준 출력을 저장할 파일에 연결한 후에 `MY-WRITE'를 호출하면 된다. (defun my-save (fname) (wit..
-
리습의 개발 방법을 배우자: 함수의 구현Programmer/Programming 2014. 6. 26. 10:37
구현이 어느정도 명확해졌으면 주로 바텀-업 방식을 사용한다. 바텀-업은 구현 결과를 눈으로 확인하며 구현하는 장점이 있다. 다소 복잡한 구현부가 있으면 스텁 함수(stub functions)로 대체한다. 스텁 함수를 사용하는 것은 이전 포스트에서 설명하였다. 스텁 함수를 예상하는 결과로 동작하도록 하드코딩 하는 것도 좋은 트릭이다. 2014/06/20 - [Programming/Functional] - 리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계 2014/06/24 - [Programming/Functional] - 리습의 개발 방법을 배우자: 함수와 하위 함수의 설계 이번 포스트에서는 엣지 리스트를 연관 리스트(association lists, 줄여서 alist)로 변환하는 함수를 개발한다. ..
-
리습의 개발 방법을 배우자: 함수와 하위 함수의 개발Programmer/Programming 2014. 6. 24. 11:36
상위 함수에서 하위 함수를 구현해 나가는 것을 탑-다운 방식으로 설명하보겠다. 보통 큰 틀을 설계할 때는 탑-다운 방식이 적합하다. 2014/06/20 - [Programming/Functional] - 리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계 2014/06/26 - [Programming/Functional] - 리습의 개발 방법을 배우자: 함수의 구현 이 게임의 배경이 되는 도시를 만든다. 주인공이 처음 방문한 도시이기 때문에 매 게임마다 새로운 도시를 만들어야 한다. [규칙 3.2] 새로운 도시를 만드는 것은 새 지도를 만드는 것이고, 지도라 함은 경로의 집합니다. 우리는 경로를 그래프로 표현한다. 경로의 끝이나 교차점을 노드라고 표현한다. 엣지는 경로의 최소 표현 단위로써, 두개의 노..
-
리습의 개발 방법을 배우자: 대도 웜퍼스 게임의 설계Programmer/Programming 2014. 6. 20. 16:06
1. 캐릭터 1.1. 리스프 에일리언 (주인공) 1.1.1. 총알 하나가 장전된 권총 1.2. 웜퍼스 (당신이 쫓고 있는 배신자) 1.2.1. 총상을 입었음 1.2.2. 성능 좋은 AK-47 소총을 가지고 다님 1.3. 반딧불이 (도시의 갱단) 1.3.1. 마주치면 행인을 눈을 가린채 다른 장소로 내던짐 1.3.2. 빛을 냄 1.4. 경찰 1.4.1. 주인공과 웜퍼스를 찾고 있음 1.4.2. 도로 중간에 장애물을 설치함 1.4.3. 싸이렌을 울림 2. 배경 장소 2.1. 도시 2.1.1. 처음 방문한 도시 3. 규칙 설계 3.1. 주인공의 공격이 실패하면 게임이 끝남 (1.1.1) 3.2. 매 게임마다 도시의 구성(장소, 도로, 다른 캐릭터의 위치 등)을 새롭게 만듬. (2.1.1) 3.3. 주인공은 임..