acceptable lisp?
아겔-_-최근(사실 1, 2년전에) 리습, 루비쪽에서 심심찮게 볼 수 있던 포스팅이죠.
- [why ruby is an acceptable lisp][1]
- [lisp is not an acceptable lisp][2]
저는 개인적으로(?리습을 알고 사랑하는 많은분들이) 우리가 막연히 생각하는 리습의 모습이 현재 개발이 진행중이거나 dynamic language, 개발방향에 있어서 어떤 지향점이거나 전체집합U로서의 심볼이라고 생각합니다. 몇가지 예로 현재 진행중이거나 세상에 모습을 드러낸 많은 것들이 그 아이디어의 원류가 리습에 있다고 생각하는 것들도 몇가지 있겠죠.(물론, lisp subset으로 생각할수있을지도 모르는) 개인적으로 자바스크립트는 가끔 스킴처럼 느껴지기도 하고([scheme vs. javascript][3]), HTML/XML은 [s-expression][4]의 변형처럼 보이기도 하고, 최근 Flex3와 같은 ecmascript류에서 사용했던 [E4X][5]나 .net의 [LINQ][6]등은 code as data와 같은 리습의 모습의 일부처럼 보이기도 합니다.(물론, 리습은 그 자체로서 그런 특성을 갖고 있고, E4X, LINQ등은 언어자체의 한계를 확장적인 방법을 통해 개선하려는 시도겠죠)
리습이 있고, 리습이 처음으로 도입한 다음 퍼져나간 수많은 개념/장치들은 물론이겠지만 저는 특별히 현재 많은 논란의 주제인 dynamic vs. static에 대해서 생각해봤습니다.
좀 많이 단순화한 생각으로 타이핑과 같은 특정한 분야에 국한된 생각이 아니라면, 저는 dynamic진영과 static진영의 경계선은 "언어기재 그 자체가 재귀적(meta-circular?)이고 직교적인 방법을 통해 그 자신의 양상을 통제할 수 있음"이라고 생각합니다.
식목일 제설작업하는 소리로 들릴수도 있으니까 예를들어 볼게요.
- 자바(static) : 프로그램 자기 자신을 수정하거나 확장(매크로나 실행시간 코드생성 같은)을 하거나 하려면 바이트코드 라이브러리니 JVM에 대한 설정이니 코드 그 자체의 범위를 벗어나는 작업을 해야하고, 방법 또한 '자바 언어'만을 아는 사람으로서는 짐작하기 힘들다. -> 재귀적인 구성도 아니고, 직교적인 방법도 아니겠죠.
- 루비(dynamic) : [RoR][7] 프레임웍의 많은 부분이 실행시간 코드 생성과 관련이 있고, 이에 대한 좋은(혹은 eval남발의-_-;;;) 예로 들 수 있겠죠. -> 루비코드와 루비자체만을 갖고 재귀적인 방법으로 자신을 확장할 수 있죠. eval류가 과연 직교적인지는 좀 의문이네요.
- [Io language][8](dynamic) : 매크로와 같은 것을 지원하지 않으면서, 직교성을 최대한 살린 최소한의 것들을 통해서 언어를 확장하고 실행시간에 자기자신을 확장 할 수 있는 능력 -> 그런 acceptable lisp의 특징, 혹은 dynamic의 경계를 잘 구현했다고 생각합니다.
- [자바스크립트][9](dynamic) : 글쎄요. 자기자신의 정보를 얻거나 하는 부분에(introspection, reflection...) 있어서는 많은 부분 부족하겠지만, 자기자신의 확장에 대한 개방/직교성 같은 부분은 단순하면서도 편리하죠.
- 리습 : 무슨 말이 필요하죠?(빠돌)
대략 그런데요, 여러분이 생각하는 'acceptable lisp'의 조건이나, 그 조건에 부합하는 언어/환경은 뭐일지 궁금해지네요.
ps. 대략 써놓고 보니 acceptable lisp란게 어떤 언어 디자인, 구현에 관심 있는 사람들의 '총체적인 환상', 이데아, 꿈속의 그녀... 뭐 그런거라는 생각도 드는군요. ^^;
ps2. 저는 역시 '이미지 기반(image based)'가 리습의 진면목이라고 생각 한다능;;;; =3=3=3
[1] : http://www.randomhacks.net/articles/2005/12/03/why-ruby-is-an-acceptable-lisp [2] : http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html [3] : http://community.schemewiki.org/?scheme-vs-javascript [4] : http://en.wikipedia.org/wiki/S-expression [5] : http://en.wikipedia.org/wiki/E4X [6] : http://msdn.microsoft.com/ko-kr/library/bb308959(en-us).aspx [7] : http://www.rubyonrails.org/ [8] : http://iolanguage.kr/ [9] : http://www.crockford.com/javascript/javascript.html
무척 와닿는 말입니다. "전체 집합 U로서의 심볼."
"Acceptable Lisp"이라고 할 때는 acceptable하냐와 Lisp과 같은 특징을 갖췄냐, 둘 모두 봐야한다고 생각합니다. 그런 면에서 저는 Ruby는 acceptable하지만 Lisp에 비교하기는 부족하다고 생각하고요--"데이터로서의 코드"가 아니죠. 그러기엔 너무 복잡한 문법이라고도 생각하고요. Io를 좋아하는 이유는 제가 생각하는 "Acceptable Lisp"에 가장 가까워서입니다. 하지만 표준 라이브러리 같은 부분에서 거의 다듬어지지 않았고, 뭘 하나 하려고 해도 필요한 작업이 스택에 많이 쌓이는(;;) 어쩔 수 없는 마이너 언어라고 생각합니다.
그렇군요.
"acceptable lisp"로서의 가치를 바라는걸수도 있겠지만, 어떤 사람은 또 다른 lisp-dialect을 바라는지도 모르겠군여.
너무 algol-like한 문법에 저도 좀 짜증이 나긴합니다.
딜레마겠지만, Io에서 만약 어떤 한 방법을 제시하는 표준 라이브러리(Haskell의 Prelude처럼?)를 제공하기 시작한다면 Io의 그런 특질은 금새 잊혀질지도 모르겠죠. 아니면 그런게 없어서 Io가 마이너일지도;;; OTL
Lisp 자체로도 충분히 acceptable하다고 생각합니다. ))))들만 어떻게 해 준다면 말이죠 :)
개인적으로 Lisp에도 조금은 syntax sugar가 있었으면 어떨까 생각하지만, 그러면 아마도 애초에 Lisp인 의미가 없겠죠.
대략 다음과 같은것들...
twinlisp : http://twinlisp.nongnu.org/docs/TwinLisp%20for%20lisp%20users.html
sweet-expressions : http://www.dwheeler.com/readable/ 당연히 괄호가 어쩌면 리습의 핵심일지도 =3=3;;;
역시 리습은 (λ)입니다. 크크크