성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Roll A Lisp In C - Reading ; https...
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>책 "프로그래밍 클로저: Lisp"을 읽고 나서.</h1> <p> Clojure 개념만이라도 한번 익혀두려고 개발환경 설정하고 ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Clojure 언어의 윈도우 개발환경 설정 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/1693'>http://www.sysnet.pe.kr/2/0/1693</a> </pre> <br /> 책 한권 읽어봤는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 프로그래밍 클로저: Lisp ; <a target='tab' href='http://www.yes24.com/24/Goods/3907543?Acode=101'>http://www.yes24.com/24/Goods/3907543?Acode=101</a> </pre> <br /> 위의 책을 읽으면서 거친 약간의 시행착오랄까.... 그런 것을 정리해 봅니다.<br /> <br /> 우선, 위의 책에서는 "clojure-contrib" 라이브러리에 있는 함수를 간혹 사용하는데요. 이상하게도 제가 설치한 clojure-contrib 바이너리는 몇 가지 함수들이 동작하지 않았습니다. 검색을 해보니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Why does my Clojure import fail? ; <a target='tab' href='http://stackoverflow.com/questions/7591649/why-does-my-clojure-import-fail'>http://stackoverflow.com/questions/7591649/why-does-my-clojure-import-fail</a> </pre> <br /> 그 이유가 나오는데요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > In addition to the answers saying that contrib 1.1 is incompatible with clojure 1.3 Taken from here: Versions of clojure-contrib are matched to versions of Clojure. If you are using Clojure 1.0, use clojure-contrib 1.0. If you are using Clojure 1.1, use clojure-contrib 1.1. If you are using Clojure 1.2, use clojure-contrib 1.2, or the new modular Contrib libraries. If you are using Clojure 1.3, use the new modular Contrib libraries. As of the date of this reply I'm not sure if there is a version of clojure.contrib.prxml that is compatible with clojure-1.3 (Someone please correct me if I'm wrong). So I would suggest using clojure-1.2.1 and clojure-contrib 1.2.0. </pre> <br /> Clojure 1.2까지만 해도 상응하는 clojure-contrib 라이브러리가 있었습니다. 책은 예전 버전으로 씌여진 것이므로 제가 설치한 1.6 버전의 clojure에는 맞지 않는 구문이 있는 것 같습니다. 그래서 몇몇 함수들의 경우 책의 내용대로 실습해보면 이렇게 오류가 발생합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > D:\lisp>java -cp .\clojure-1.6.0\clojure-1.6.0\clojure-1.6.0.jar;.\clojure-contrib.jar clojure.main -i .\init_run.clj -r Clojure 1.6.0 user=> (use '[clojure.contrib.lazy-seqs :only (primes)]) <span style='color: blue; font-weight: bold'>NoSuchMethodError</span> clojure.lang.RestFn.<init>(I)V clojure.contrib.def/defmacro---509 (def.clj:39) </pre> <br /> 그래도 clojure-contrib의 몇몇 함수는 정상 동작합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > user=> (str-join "te" "test") "tteetestet" </pre> <br /> 가장 최신의 clojure.contrib를 보니,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Clojure Contrib Libraries ; <a target='tab' href='http://dev.clojure.org/display/doc/Clojure+Contrib+Libraries'>http://dev.clojure.org/display/doc/Clojure+Contrib+Libraries</a> </pre> <br /> "Modular Contrib"라고 명명되고 있으며 다음의 설명이 함께 하고 있습니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> Modular Contrib projects (<span style='color: blue; font-weight: bold'>compatible with Clojure 1.2.0** thru 1.5.0</span>, each in its own repo). **Mostly... support for Clojure 1.2.x is being dropped from several Contrib projects now - check the individual projects' test matrix on the build server to be sure of version support. </div><br /> <br /> 암튼, 저 같은 초보자에게는 좀 혼돈스럽습니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 그다음, 오탈자가 영문 서적 기준으로 다음의 사이트에서 제공됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <a target='tab' href='http://pragprog.com/titles/shcloj/errata'>http://pragprog.com/titles/shcloj/errata</a> </pre> <br /> 한글 서적이 위의 것을 반영했는지는 확인해 보지 못했습니다. 참고로, 저도 오탈자를 하나 발견했는데요. "4장 117 페이지"에 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > take나 split 또는 drop으로 시작하는 함수는 모두 평가가 지연된 시퀀스(lazy sequence)를 반환한다. </pre> <br /> 라고 되어 있는데 직접 확인해 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > user=> (class (take-while (complement #{\a\e\i\o\u}) "the-quick-brown-fox")) clojure.lang.<span style='color: blue; font-weight: bold'>LazySeq</span> </pre> <br /> 이처럼 LazySeq로 나오는 것이 정상인데, split의 경우는 그것으로 시작한다고 모두 지연된 시퀀스는 아닙니다. split-at 함수가 그 한 예입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > user=> (class (split-at 5 (range 10))) clojure.lang.<span style='color: blue; font-weight: bold'>PersistentVector</span> </pre> <br /> <hr style='width: 50%' /><br /> <br /> 마지막으로, 이 책을 읽으면서 가장 이해가 안되었던 것이 recur 함수의 사용법이었습니다. 171페이지에 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > (defn parity [n] (loop [n n par 0] (if (= n 0) par (recur (dec n) (- 1 par))))) </pre> <br /> 라는 코드가 있는데 par의 값이 변하는 것인가?... 그렇다면 왜 그것이 변할 수 있도록 평가가 되는 것인지 이해가 안되었습니다. 예를 들어 다음의 코드는 par에 값이 저장되지 않습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > (defn parity [n] (let [par 0] (- 1 par) (println par))) </pre> <br /> 그래서 Clojure 포럼에 질문을 했는데 ^^<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <a target='tab' href='https://groups.google.com/forum/#!topic/lisp-korea/1waSJVuDORg'>https://groups.google.com/forum/#!topic/lisp-korea/1waSJVuDORg</a> </pre> <br /> 다음과 같은 친절한 설명을 들었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > recur는 그 평가된 결과값이 다시 그 회귀시작점(recurtion point)으로 재바인딩됩니다. <a target='tab' href='http://clojure.org/special_forms#recur'>http://clojure.org/special_forms#recur</a> 위 코드에서는 회귀시작점(recursion point)가 loop이고, recur 문구(form)의 결과는 각각 loop의 바인딩 문구(form)의 n과 par에 재바인딩됩니다. >(loop [i 10 j 5] (if (= j 0) [i j] (recur (inc i) (dec j)))) ;=> [15 0] recur의 회귀시작점(recursion point)는 loop 뿐 만 아니라 함수가 될 수도 있습니다. > (defn f [i j] (if (= j 0) [i j] (recur (inc i) (dec j)))) > (f 10 5) ;=> [15 0] </pre> <br /> 그렇습니다. 회귀 시작점으로 재바인딩 된다는 저 사실을 모르는 상태에서는 parity 함수의 해석이 불가능했던 것입니다. 책에는 저렇게 친절하게 설명이 안되어 있습니다. ^^<br /> <br /> <hr style='width: 50%' /><br /> <br /> 암튼, LISP 언어를 이참에 접해봤는데... 역시나 어렵긴 합니다. 함수형 언어들이 최근 들어 재조명되고는 있지만, 글쎄요... 역시나 Clojure와 같은 언어들이 주류 언어에 편승하기에는 아직 시기상조인 듯 합니다. 달리 말하면, 아직 시간의 여유가 있으니 조금은 숨을 돌릴 수 있을 것 같다는! ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
4002
(왼쪽의 숫자를 입력해야 합니다.)