들어가며
🚧 사이트 공사중입니다.
LISP(LIS
t P
rocessing)
REPL
REPL: 읽고(R
ead) 평가하고(E
val) 출력(P
rint)을 반복(L
oop)
* (load "hello.lisp")
Ref
설치
-
SBCL을 설치하도록 합니다.
-
rlwrap (ReadLine Wrapper)
Ref
- https://lispkorea.github.io/commonlisp/setup_sbcl/
- https://lispkorea.github.io/commonlisp/setup_slt/
- https://lispcookbook.github.io/cl-cookbook/editor-support.html
SBCL
SBCL: S
teel B
ank C
ommon L
isp
⚠️ 주의
설치시 폴더명에 공백 없도록.
- emacs를 사용할시 패키지에서 실행파일을 못 찾거나, 실행하지 못하는 문제가 생길 수 있음.
- 기본 설치폴더
C:\Program Files\Steel Bank Common Lisp
이 아닌C:\SBCL
와 같이 공백이 없도록 설치한다.
lisp파일의 라인 끝은(eol, End of Line)은 LF
(line feed)로 끝나도록 한다.
- SBCL에는 윈도우의 기본 라인엔딩
CRLF
(carriage return + line feed) 문제가 있다.
따라서 .editorconfig, .gitattribute 를 수정 해 강제해 주는 편이 좋다.
# file: .editorconfig
root = true
# Lisp 파일 설정
[*.lisp]
end_of_line = lf
insert_final_newline = true
charset = utf-8
# file: .gitattribute
*.lisp text eol=lf
*.asd text eol=lf
*.cl text eol=lf
아톰
- Lisp에서 모든 데이터는 콘스 셀(cons cell) 혹은 아톰(atom) 중 하나.
사전 지식
표기법(notation)
- 표기법
- 전위 표기법(prefix notation) : + 1 2
- 중위 표기법(infix notation) : 1 + 2
- 후위 표기법(postfix notation) : 1 2 +
- 자동완성
- 전위 표기법 특성 상 Method Completion / Property Completion 이 안됨
- 심볼 자동완성에 의존
code is data — Homoiconicity
참과 거짓
참 : T 거짓 : NIL
아톰이 아닌 것
- Cons Cell인 것
- Cons Cell이 결합된 리스트(list) 역시 아톰이 아니다.
- Cons Cell (콘스 셀)
- 두 개의 값을 담는 한 쌍 (first . second)
- List (리스트)
- Cons Cell을 이어 붙인 연결 구조
📋 Cons는 아톰이 아니다
(atom (cons 1 2)) ; => NIL
(atom '(1 . 2)) ; => NIL
📋 리스트는 아톰이 아니다
(atom (list 1 2 3)) ; => NIL
(atom '(1 2 3)) ; => NIL
아톰인 것
🔢 숫자는 아톰
(atom 42) ; => T
(atom -1.5) ; => T
🔤 문자열, 문자도 아톰
(atom "hello") ; => T
(atom #\A) ; => T
📌 키워드도 아톰
(atom :ok) ; => T
🧠 심볼도 아톰
(atom 'x) ; => T
(atom 'atom) ; => T
🧪 T / NIL 도 아톰이다
'()은 NIL과 동의어(synonym)
(atom T) ; => T
(atom NIL) ; => T
(atom '()) ; => T
📦 함수 객체도 아톰이다
(atom #'helloworld) ; => T
짚고 넘어가기
atom
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_01.html
Cons
s-expression
cons cell
car cdr
cons가 아닌 것은 아톰
(atom (cons 1 2))
;;=> NIL
(consp '())
;;=> NIL
(consp '(1))
;;=> T
(consp '(1 . 2))
;;=> T
(consp '(1 2))
;;=> T
(type-of '())
;;=> NULL
(typep '() 'atom)
;;=> T
(type-of '(1))
;;=> CONS
(typep '() 'cons)
;;=> NIL
(typep '() 'list)
;;=> T
(typep '(1) 'cons)
;;=> T
(typep '(1) 'list)
;;=> T
(typep '(1 . 2) 'cons)
;;=> T
(typep '(1 . 2) 'list)
;;=> T
car
,cdr
는first
,rest
보다 가독성이 떨어지니, 아이템이 2개 있는 Cons Cell을 제외하고는 사용을 안하는게 하는게 좋음.
짚고 넘어가기
cons
consp
car
/cdr
first
/second
/third
/fourth
/fifth
/sixth
/seventh
/eighth
/ninth
/tenth
rest
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_04.html
표현식
(+ 1 1)
;; => 2
(+ 1 1)
라는 평가(eval)할 수 있는 표현식(expression)이 있고, 리스프에서는 이를S-expression
이라 합니다.S-Expression
은S
ymbolic-Expression의
약자로, 더 줄여서sexpr
라 쓰기도 합니다.
sexpr은 Atom | Expression으로 되어있으며, 각각은 다음과 같습니다.
Atom : 숫자 | 심볼.
여기서 심볼은 변수이름이나 데이터로 사용되는 문자집합.
Expression
(x . y)와 같은 형태(form)를 띈 표현식. (여기서 x, y는 s-exression)
(x y z) => (x . (y . (z . nil))
=> (심볼 . (심볼 . (심볼 . 심볼))
=> (Atom . (Atom . (Atom . Atom)
=> Expression (Expression (Expression))
=> Expression
(+ 1 1) => (+ . (1 . (1 . nil))
=> (심볼 . (숫자 . (숫자 . 심볼))
=> (Atom . (Atom . (Atom . Atom)
=> Expression (Expression (Expression))
=> Expression
이제 (eval '(+ 1 1))와 같이 eval로 (+ 1 1)이라는 표현식을 평가시키면 2라는 숫자를 얻게됩니다.
https://www.cliki.net/infix
AST(Abstract Syntax Tree) 수학표기
M-Expression (M
eta-Expressions
) Lets LISP like it's 1959
https://en.wikipedia.org/wiki/M-expression http://xahlee.info/comp/lisp_sans_sexp.html
심볼
(defparameter x 42) (symbol-value 'x) ; => 42 (symbol-name 'x) ; => "X" (symbol-package 'x) ; => #<PACKAGE "COMMON-LISP-USER">
(intern "AAAA") ; => AAAA (intern "aaa") ; => |aaa|
할당 assign (let* ) let flet labels
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_05.html
주석
한 줄 주석
한 줄 주석은 세미콜론( ; )으로 시작합니다
예)
세미콜론 갯수 | 쓰임세 |
---|---|
4개 | 파일 단위로는 |
3개 | 구획(section) 설명으로는 |
2개 | 정의(definition) 안에서는 |
1개 | 한개의 라인에 대해서 |
;;;; hello.lisp
;;; Welcome
;;; Lisp World
(defun hello (a b)
;; a와 b를 더하고
(+ a b)) ; 반환
여러 줄 주석
- 여러줄 주석
#|
으로 시작해서|#
로 끝납니다. - 코딩 스타일로
#| |#
로 감싸는 여러 줄 주석보다는 세미콜론;
로 처리하는 주석을 더 선호하기도 함.
#|
여러 줄 주석
#|
이런것 도 가능
|#
|#
함수
scope - lexical / dynamic
함수 정의
defun
closure
counter
(documentation 'hello 'function) (documentation (function hello) 'function) (documentation #'hello 'function) (funcall 'hello "hi") (inspect 'hello)
let/let* flet/labels
(values 1 2) multiple-value-bind multiple-value-list values-list
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_07.html
재귀
values
function.md
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_09.html
return
람다
조건문
flow
https://github.com/Shinmera/for/ https://iterate.common-lisp.dev/ https://github.com/yitzchak/trivial-do/
비교
Ref
- https://eli.thegreenplace.net/2004/08/08/equality-in-lisp
- https://www.nhplace.com/kent/PS/EQUAL.html
짚고 넘어가기
=
eq
eql
equal
equalp
데이터 타입
1 1.1 1234567890123456789012345678901234567890123456789012345678901234567890 #C(1.2 3) ; 1.2 + 3i
type-of | |
---|---|
cons | |
null | |
symbol | |
condition | |
function | |
sequence | |
array | |
vector | |
bit-vector | |
hash-table | |
stream | |
integer | |
float | |
number | |
short-float | |
single-float | |
double-float | |
long-float | |
complex | |
ratio | |
rational | |
string | |
character | |
random-state | |
package | |
pathname | |
readtable | |
restart |
array atom bignum bit bit-vector chracter [common] compiled-function complex cons double-float fixnum float function hash-table integer keyword list long-float nil null number package pathname random-state ratio rational readtable sequence short-float signed-byte simple-array simple-bit-vector simple-string simple-vector single-float standard-char stream string [string-char] symbol t unsigned-byte vector
typep subtypep type-of
make-random-state | |
---|---|
random-state | random-state 복사 |
nil (기본값) | 현재 random-state 복사 |
t | 새로운 random-state |
Common Lisp | |
---|---|
(logand a b c) | a & b & c |
(logior a b c) | a | b | c |
(lognot a) | ~a |
(logxor a b c) | a ^ b ^ c |
(ash a 3) | a << 3 |
(ash a -3) | a >> 3 |
log: bit-wise log
ical operations
ash: a
rithmetic sh
ift operation
https://www.lispworks.com/documentation/lw70/CLHS/Body/f_logand.htm
숫자
Integers Ratios 분수 Floating-Point Numbers Complex Numbers
integer fixnum bignum ratio ratio, rational, real, number, t
float #C(a b) #\char
most-positive- most-negative- fixnum / short-float / single-float / long-float
진법 | ||
---|---|---|
2진법 | #b | b inary |
8진법 | #o | o ctal |
16진법 | #x | hex adecimal |
N진법 | #Nr | 여기서 N은 임의의 수 |
부동 소수점 | |
---|---|
s | s hort-float |
f | single-f loat |
d | d ouble-float |
l | l ong-float |
복소수
a + bi == (complex a b) == #C(a b)
(type-of #C(1 2))
;;=> (COMPLEX (INTEGER 1 2))
(typep #C(1 2) 'complex)
;;=> T
(complex 1 2)
;;=> #C(1 2)
(* #C(1 2) #C(1 2))
;;=> #C(-3 4)
(complexp #C(1 2))
;;=> T
1+ 1- incf decf min max minusp / zerop / plusp evenp / oddp
LOG EXP EXPT SIN/COS/TAN ASIN/ACOS/ATAN 쌍곡선 함수: SINH, COSH, 및 TANH ASINH, ACOSH, 및 ATANH.
FLOOR CEILING TRUNCATE ROUND MOD REM
isqrt, which returns the greatest integer less than or equal to the exact positive square root of natural.
gcd G
reatest C
ommon D
enominator
lcm L
east C
ommon M
ultiple.
Ref
- The Common Lisp Cookbook – Numbers
- Common Lisp the Language, 2nd Edition - 2.1. Numbers
- Practical Common Lisp - 10. Numbers, Characters, and Strings
불리언
문자
CHAR= 대소문자 구분 CHAR-EQUAL 대소문자 구분 x
Numeric Analog | Case-Sensitive | Case-Insensitive |
---|---|---|
= | CHAR= | CHAR-EQUAL |
/= | CHAR/= | CHAR-NOT-EQUAL |
< | CHAR< | CHAR-LESSP |
> | CHAR> | CHAR-GREATERP |
<= | CHAR<= | CHAR-NOT-GREATERP |
>= | CHAR>= | CHAR-NOT-LESSP |
Ref
문자열
Numeric Analog | Case-Sensitive | Case-Insensitive |
---|---|---|
= | STRING= | STRING-EQUAL |
/= | STRING/= | STRING-NOT-EQUAL |
< | STRING< | STRING-LESSP |
> | STRING> | STRING-GREATERP |
<= | STRING<= | STRING-NOT-GREATERP |
>= | STRING>= | STRING-NOT-LESSP |
:start1 :end1 :start2 :end2
(string= "foobarbaz" "quuxbarfoo" :start1 3 :end1 6 :start2 4 :end2 7)
interpolation
- CL-INTERPOL
- String interpolation for Common Lisp
format
- https://lispcookbook.github.io/cl-cookbook/strings.html#string-formatting-format
- https://gigamonkeys.com/book/a-few-format-recipes
Ref
배열
(defparameter *array* (make-array '(2 4) :initial-element 0))
;;=> *ARRAY*
*array*
;; => #2A((0 0 0 0) (0 0 0 0))
(aref *array* 0 0)
;; => 0
(setf (aref *array* 0 0) 100)
;; => 100
*array*
;; => #2A((100 0 0 0) (0 0 0 0))
(setf (aref *array* 1 1) 100)
;; => 100
*array*
;; => #2A((100 0 0 0) (0 100 0 0))
벡터
해시테이블
구조체
(defstruct Hello
a
b)
(make-Hello :a 1 :b 2)
;; :conc-name
짚고 넘어가기
defstruct
make-Blabla
map
(setq a '(1 2 3 4 5 6))
;;=> (1 2 3 4 5 6)
(dotimes (i 7)
(let ((*print-length* i))
(format t "~&~D -- ~S~%" i a)))
;;>> 0 -- (...)
;;>> 1 -- (1 ...)
;;>> 2 -- (1 2 ...)
;;>> 3 -- (1 2 3 ...)
;;>> 4 -- (1 2 3 4 ...)
;;>> 5 -- (1 2 3 4 5 ...)
;;>> 6 -- (1 2 3 4 5 6)
;;=> NIL
파일 입출력
바인드
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_06.html
패키지
항목 | Quicklisp | Ultralisp |
---|---|---|
URL | https://www.quicklisp.org | https://ultralisp.org |
주 목적 | 안정적인 패키지 배포 | 빠른 릴리스/CI 기반 배포 |
릴리스 주기 | 한 달에 한 번 수동 릴리스 | 자동화된 CI 시스템으로 몇 시간마다 |
;; ultralisp install
(ql-dist:install-dist "http://dist.ultralisp.org/" :prompt nil)
Ref
타입 part2
에러
error warn 'simple-error (signal (make-condition 'error) ) (define-condition my-condition (simple-condition) // 사용자 에러 정의 )
// sb-xc (ignore-errors (error "wtf")) (unwind-protect (error "wtf") )
(invoke-debugger (trivial-backtrace:print-backtrace https://github.com/hraban/trivial-backtrace Portable simple API to work with backtraces in Common Lisp
handle-case https://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node346.html https://lisp-docs.github.io/cl-language-reference/chap-9/j-b-condition-system-concepts
https://cl-community-spec.github.io/pages/handler_002dbind.html
매크로
` | Backquote |
, | Comma |
,@ | Comma-splice |
', | Quote-comma |
quote defmacro
매크로 확장 M-x slime-macroexpand-all (C-c M-m)
매크로를 수정하게 되면 매크로를 쓴 함수 역시 다시 평가해야 하는데 M-x slime-who-macroexpands 로 찾고 C-c C-k로 컴파일
&body (gensym) variable capture
- compile function
- read time - reader macros
- macro expansion time - macros
- compilation time
- run time - function
alexandria:with-gensyms https://alexandria.common-lisp.dev/ https://gitlab.common-lisp.net/alexandria/alexandria
================================================================================================================================================ define-symbol-macro symbol-macrolet
sharpsign(#) - https://www.lispworks.com/documentation/HyperSpec/Body/02_dh.htm
#. read-time evaluation
(defun func1 () :my-func1)
(defun #.(func1) () :kkk)
;;> (:func1) ;;=> :FUNC10 ;;> (:my-func1) ;;=> :KKK
(asdf:defsystem "mysystem" :decription "short description" :long-description #.(uiop:read-file-string (subpathname load-pathname "README.md")))
-
sly-macrostep
-
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_03.html
-
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_08.html
-
gensym
-
quote
gensym
디버그
(declaim (optimize (debug 3) (speed 0) (safety 3)))
(declare (ignore arg))
Ref
- https://malisper.me/category/debugging-common-lisp/
- Debugging Lisp: fix and resume a program from any point in the stack - how Common Lisp stands out.
- https://cl-community-spec.github.io/pages/invoke_002ddebugger.html
ASDF
버전 | |
---|---|
3 | released May 15th 2013. UIOP is part of ASDF 3 |
2 | François-René Rideau's ASDF 2 (released May 31st 2010). |
1 | Daniel Barlow's ASDF (created on August 1st 2001) |
- ASDF
A
notherS
ystemD
efinitionF
acility
- .asd 파일
- lisp 프로젝트 관리 파일
A
SDFs
ystemd
efinition
경로 | 설명 |
---|---|
~/common-lisp/ | Common Lisp 소프트웨어 설치 기본 위치(권장) |
~/.local/share/common-lisp/source/ |
- 크게 다음 2파트로 나뉩니다.
asdf/defsystem
: 패키지정의uiop
: 유틸리티
;; file: helloworld/helloworld.asdf
(asdf:defsystem "helloworld"
:build-operation program-op
:build-pathname "helloworld"
:entry-point "helloworld::main"
:depends-on ()
:components
((:static-file "README.md")
(:module "src"
:depends-on ()
:components
((:file "package")
(:file "hello" :depends-on ("package"))))))
;; file: helloworld/src/package.lisp
(defpackage :helloworld
(:use :common-lisp))
(in-package :helloworld)
;; file: helloworld/src/hello.lisp
(in-package :helloworld)
(defun -main (args)
(princ args))
(defun main ()
(-main (uiop:command-line-arguments)))
.asd
시스템이 있고 그 다음 패키지
- #P"..." : Common Lisp에서 pathname 리터럴을 의미합니다.
- 예: #P"/home/user/code" → (make-pathname :directory '(:absolute "home" "user" "code"))
- 해당 경로가 실제 존재하는지는 확인하지 않음
- truename : Pathname 리턴
- (truename "D:/@lisp/my-lisp-systems") ;; => #P"D:/@lisp/my-lisp-systems/"
- 경로가 존재하지 않으면 에러
(require 'asdf) ; => ("ASDF" "asdf" "UIOP" "uiop")
;;; 버전 확인
(asdf:asdf-version) ; => "3.3.1"
;;; 시스템 폴더를 센트럴 레지스트리에 추가
(pushnew (truename "D:/@lisp/my-lisp-systems/helloworld") asdf:*central-registry*)
;;; 시스템 로드. helloworld.asd 파일을 읽어들임
(asdf:load-system :helloworld)
;;; 시스템 로드 ( 강제 )
(asdf:load-system :helloworld :force t)
(asdf:make :helloworld)
(asdf:load-system :helloworld)
(asdf:compile-system :helloworld)
.fasl - Fas
t L
oading (or Loadable) file
(asdf:operate 'asdf:compile-bundle-op :helloworld :verbose t)
program-op | (create a standalone application, which we will see below), etc. |
compile-bundle-op | (create a single fasl for the entire system, for delivery), |
monolithic-compile-bundle-op | (create a single fasl for the entire system and all its transitive dependencies, for delivery), |
compile-op | (ensure the system is compiled, without necessarily loading all of it, or any bit of it), |
image-op | (create a development image with this system already loaded, for fast startup), |
load-source-op | (load the system from source without compiling), |
compile-bundle-op필요한 각 시스템에 대해 하나의 FASL 파일을 생성하고, 여러 FASL을 하나로 묶어 각 시스템을 하나의 FASL로 제공할 수 있습니다. monolithic-compile-bundle-op대상 시스템과 모든 종속성에 대해 하나의 FASL 파일을 생성하여 전체 애플리케이션을 하나의 FASL로 제공할 수 있습니다
(defsystem :mysystem :class :precompiled-system :fasl (some expression that will evaluate to a pathname))
;; asdf:operate == asdf:oos ( operate-on-system )
(asdf/output-translations:output-translations) asdf/output-translations:output-translations https://github.com/fare/asdf/blob/master/output-translations.lisp
https://www.sbcl.org/manual/asdf.html#Configuring-ASDF-to-find-your-systems
asdf/defsystem
- https://asdf.common-lisp.dev/asdf.html
- https://www.sbcl.org/manual/asdf.html
- https://qiita.com/MYAO/items/874aafcc531862c5f7c7
- https://github.com/fare/asdf/blob/master/doc/best_practices.md
uiop
UIOP(U
tilities for I
mplementation and O
S-P
ortability)
- https://asdf.common-lisp.dev/uiop.html
- https://quickdocs.org/uiop
- https://zenn.dev/hyotang666/articles/3f7abcec6f8270
;; example
(require 'asdf) ; => ("ASDF" "asdf" "UIOP" "uiop")
(uiop:command-line-arguments) ; 커맨드라인 인자
(uiop:getenv "USER")
(uiop:run-program "firefox") ; 동기
(uiop:launch-program "firefox") ; 비동기
(uiop:run-program (list "git" "--help") :output t)
(uiop:run-program "htop" :output :interactive :input :interactive)
;;; pipe: ls | sort
(uiop:run-program "sort"
:input
(uiop:process-info-output
(uiop:launch-program "ls"
:output :stream))
:output :string)
(uiop:with-temporary-file (:stream s :pathname p :keep t)
(format t "path is ~a~%" p)
(format s "hello, temporary file!"))
(uiop:quit 0)
Ref
- https://asdf.common-lisp.dev/asdf.html
- https://asdf.common-lisp.dev/uiop.html
- https://asdf.common-lisp.dev/uiop.html#UIOP_002fOS
- https://asdf.common-lisp.dev/uiop.html#UIOP_002fFILESYSTEM
- https://asdf.common-lisp.dev/uiop.html#UIOP_002fUTILITY
- https://asdf.common-lisp.dev/uiop.html#UIOP_002fPACKAGE
- https://asdf.common-lisp.dev/asdf.html#Defining-systems-with-defsystem
FFI(Foreign Function Interface)
ABI(A
pplication B
inary I
nterface)
C ABI C언어의 ABI
FFI(F
oreign F
unction I
nterface)
2. FFI는 ABI 호환을 맞춰주는 "인터페이스" 역할
libclang: Clang의 내부 AST(Abstract Syntax Tree)을 외부에서 분석할 수 있게 해주는 C API 라이브러리
- cffi
- cl-autowrap
Test
https://github.com/fukamachi/rove https://github.com/lmj/1am https://github.com/lispci/fiveam
https://lispcookbook.github.io/cl-cookbook/testing.html https://sabracrolleton.github.io/testing-framework
https://github.com/OdonataResearchLLC/lisp-unit https://github.com/OdonataResearchLLC/lisp-unit/wiki
https://github.com/g000001/lisp-critic
Regular Expressions
- CL-PPCRE(Portable Perl-compatible regular expressions)
network
CLOS
C
ommon L
isp O
bject S
ystem
defpackage :hello :use :common-lisp :documentation in-package :hello
(defclass Hello () (name age) ) 에서 C-c C-y하면 (make-instance 'Hello ) 가 입력됨
(setf hello (make-instance 'Hello)) (setf (slot-value hello 'name) "my name") :initform :initarg :reader / :writer / :accesor :documentation :allocation - :class / :instance
(defclass Hello () ((name :documentation "Name" :initarg :name :accessor name))) ;; C-c C-y
(defmethod hi ((o Hello)) (format t "Hello ~a!" (name o)))
(defparameter a (make-instance 'Hello :name "my Name"))
call-next-method // super
(typep a 'BaseA) ;; => T // a is BaseA subtypep ✔️ 타입 vs 타입 비교 // typeof(Derived).IsSubclassOf(typeof(Base)) find-class 클래스 심볼로 클래스 객체를 찾아줌 // typeof class-of 객체가 정확히 어떤 클래스의 인스턴스인지 알려줌 // .GetType()
:before / :after / :around
(defmethod print-object ((o Hello) stream) ) (print-unreadable-object (defmethod INITIALIZE-INSTANCE
다중상속 가능
(defgeneric greet (obj) (:documentation "asdf") (:method ((p person)) ) (:method ((o X)) )) https://github.com/pcostanza/closer-mop
M-x slime-unintern-symbol (fmakunbound 'greet)
MOP
M
etao
bject P
rotocol
Ref
- https://lispcookbook.github.io/cl-cookbook/clos.html
- https://cl-community-spec.github.io/pages/defclass.html
- https://cl-community-spec.github.io/pages/print_002dobject.html
- https://cl-community-spec.github.io/pages/Initialize_002dInstance.html
- https://cl-community-spec.github.io/pages/Inheritance.html
- https://cl-community-spec.github.io/pages/defgeneric.html
짚고 넘어가기
defclass
defmethod
리더매크로
https://github.com/melisgl/named-readtables
https://lispkorea.github.io/successful-lisp-kr/ch03/lesson_12.html
심볼매크로
Loop
dotimes // for
dolist // foreach
(loop :for x :in '(1 2 3) :collect (* x 10))
for:
iter:
- iterate
- reiterate
Ref
Format
자투리
우주로
DS1(Deep Space 1호) 이온 추진을 사용한 최초의 NASA 우주선. DS1 우주선이 우주속에서 교착 상태에 빠져서 고장이 남.
이온 엔진
- 60 million miles는 (96,560,400 km) 지구에서 태양 거리의 65%쯤 되는 거리(지구에서 달 거리의 250배쯤 된다)
- 빛의 속도(= 299,792 km/s (약 30만 km/s))로도 5분 22초(총 322초)걸림.
Repl을 연결해서 덤프를 긁어옴, 문제를 해결할 이벤트 찾아서, 다시 DS1에 쏴서 교착상태를 품
게임속으로
Uncharted로 유명한 Naughtydog에서 게임 스크립트 언어로 사용한 Lisp
-
Racket
-
Ref
- https://news.ycombinator.com/item?id=29987501
- GDC 2008 Adventures in Data Compilation and Scripting for UNCHARTED: DRAKE'S FORTUNE
- GDC 2009 State-Based Scripting in Uncharted 2: Among Thieves
- slide
- Jason Q. Gregory
- RacketCon 2013: Dan Liebgold - Racket on the Playstation 3? It's Not What you Think!
- Dan Liebgold
- GDC 2014 A Context-Aware Character Dialog System
- slide
- Jason Gregory
- HandmadeCon 2016 - Large-scale Systems Architecture
- Jason Gregory
Quicklisp
;; REF: https://www.darkchestnut.com/2016/quicklisp-load-personal-projects-from-arbitrary-locations/
(pushnew (truename "/projects/app/") ql:*local-project-directories* )
(ql:register-local-projects)
(ql:quickload :app)
deploy - https://github.com/Shinmera/deploy commandline parser clingon - https://github.com/dnaeon/clingon cl21 - https://github.com/cl21/cl21 - https://lispcookbook.github.io/cl-cookbook/cl21.html
커먼리스프 역사
Lisp 1 vs Lisp 2
네임스페이스 | 언어 | |
---|---|---|
Lisp2 | 함수와 변수 분리 | Common Lisp |
Lisp1 | 하나로 | Clojure / Scheme |
https://www.nhplace.com/kent/Papers/Technical-Issues.html
배포판(implementation)
- SBCL(Steel Bank Common Lisp)
- ECL(Embeddable Common Lisp)
- ABCL(Armed Bear Common Lisp)
- CCL(Clozure Common Lisp)
- CLISP
- CLASP
- Bringing Common Lisp and C++ Together
- Allegro Common Lisp by fanz
- Lispworks
Ref
인물들
John McCarthy
- Lisp의 아버지 "존 매카시” (1927년 9월 4일 ~ 2011년 10월 24일)
1956년 | 다트머스 학회에서 처음으로 인공지능(Artificial Intelligence)이라는 용어를 창안 |
1958년 | Lisp 개발시작 |
1960년 | 논문 "Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I" |
1971년 | 튜링상 수상. 인공지능에 대한 연구업적 인정 |
Lisp 만들기
- Build Your Own Lisp
- src
- C 언어로 구현. 매크로 구현 없음
- kanaka/mal
- https://github.com/kanaka/mal/blob/master/process/guide.md
- 가이드 문서 한장으로 테스트 풀어나가는 형식. 매크로 구현 있음
- 여러 언어로 구현된 소스들이 있음.
- building-lisp
- src
- C 언어
- microsoft/schemy
- A lightweight embeddable Scheme-like interpreter for configuration
- C#언어
- https://bernsteinbear.com/blog/lisp/
- C 언어
- SICP (Structure and Interpretation of Computer Programs)
- by Harold Abelson and Gerald Jay Sussman with Julie Sussman
- 번역서) 컴퓨터 프로그램의 구조와 해석
- 번역) 김재우,안윤호,김수정,김정민, 감수) 이광근
- https://github.com/lisp-korea/sicp
- https://github.com/lisp-korea/sicp2014
참고자료
문서
- CLiki - the common lisp wiki
- CL Cookbook
- Common Lisp Docs
- https://github.com/CodyReichert/awesome-cl
- https://common-lisp-libraries.readthedocs.io/
Cheatsheet
사전
- NovaSpec
- HyperSpec
- CL CommunitySpec (CLCS)
- ANSI Common Lisp specification draft
- Common Lisp Quick Reference
- https://quickdocs.org/