2010-12-31 2 views
11

나는 Peter Lovig에 의해 패러다임의 인공 지능 프로그래밍 (PAIP)을 읽고 있는데, 나는 일반적인 Lisp보다는 Clojure에서 모든 코드를 작성하려고 노력하고있다. 그러나 39 페이지의이 코드 조각에 붙어 있습니다 :Clojure (PAIP)에 Lisp 코드 이식하기

(defparameter *simple-grammar* 
    '((sentence -> (noun-phrase verb-phrase)) 
    (noun-phrase -> (Article Noun)) 
    (verb-phrase -> (Verb noun-phrase)) 
    (Article -> the a) 
    (Noun -> man ball woman table) 
    (Verb -> hit took saw liked)) 
    "A grammar for a trivial subset of English.") 

(defvar *grammar* *simple-grammar*) 

어떻게 이것을 Clojure로 변환 할 수 있습니까? 감사합니다. .

+0

Clojure는 잘 모르겠지만 목록 리터럴을 같은 방식으로 인용하지 않습니까? 'defparameter'를'def'로 변경하십시오. docstring이 다른 방법으로 제공되는 것처럼 보입니다. 그 점에 대해서는 확실하지 않습니다. – Ken

+0

코드의 소스 인 http://norvig.com/paip/simple.lisp을 보면, *는 실제 코드에서는 사용되지 않지만 목록의 목록에 대해서는 구문 설탕으로 사용됩니다. –

+1

나는 clojure (더 많은 것)에서 paip을 만들었다. https://github.com/nickik/ParadigmsOfAiprogramming – nickik

답변

12

나는이야 상대적으로 Clojure 초보자. 여기서 고려해야 할 것은 Norvig의 코드 ("Common-Lisp-flavored"Clojure 작성하기) 나 관용적 인 Clojure에 더 가까운 것을 쓰고 싶다면 가능한 한 밀접하게 고착하고 싶은가하는 점입니다. 다음은 내가 한 일입니다.

(use '[clojure.contrib.def :only [defvar]]) 

(defvar *simple-grammar* 
    {:sentence [[:noun-phrase :verb-phrase]] 
    :noun-phrase [[:Article :Noun]] 
    :verb-phrase [[:Verb :noun-phrase]] 
    :Article ["the" "a"]  
    :Noun ["man" "ball" "woman" "table"] 
    :Verb ["hit" "took" "saw" "liked"]} 
    "A grammar for a trivial subset of English.") 

defvar는 설탕을 더 자연스럽게 바스에 첨가 할 수있게 해주는 설탕입니다. 이 경우 각 규칙의 LHS에서 RHS로 사전 스타일 조회를 얻으려면 맵 ({}으로 구분 된 키 값 쌍)을 사용하고 있습니다. 또한 각 규칙의 RHS를 나타내는 목록 대신 벡터 ([]로 구분)를 사용하고 있습니다. 일반적으로 말하자면, "관용적 인"Clojure 코드는 목록을 사용하여 순차적 데이터를 유지하는 경우는 거의 없다. Clojure 양식 (소스 코드)을 대표하지 않는 한 벡터가 선호됩니다.

이러한 종류의 변경으로 인해 중첩 된 목록을 조작하기위한 작은 도우미 함수를 작성하는 대신에 언어의 내장 된 기능을 더 많이 사용할 수 있습니다.

+0

Mike에게 감사한다. –

5

켄의 권리, 바로 데프 * 양식에 대한 간단한 몇 가지 변경 및 문서화 문자열의 다른 스타일 (문서화 문자열은 정상 바르보다 함수 정의에 대한 조금 더 간단) :

(def ^{:doc "A grammar for a trivial subset of English."} 
    *simple-grammar* 
    '((sentence -> (noun-phrase verb-phrase)) 
    (noun-phrase -> (Article Noun)) 
    (verb-phrase -> (Verb noun-phrase)) 
    (Article -> the a) 
    (Noun -> man ball woman table) 
    (Verb -> hit took saw liked))) 

(def *grammar* *simple-grammar*)