2010-12-31 10 views
11

私はの人工知能プログラミングのパラダイムを読んでいますPeter Norvigによる(PAIP)と私はすべてのコードをClojureではなく一般的なLispで記述しようとしています。しかし、私はこのコードを39ページに貼り付けています。LispコードをClojure(PAIP)に移植する

(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/ParadigmsOfAproroming – nickik

答えて

12

私は相対的なClojureの初心者は、この正確な運動をしばらく前に行った。ここで考慮すべき点は、Norvigのコード(「Common-Lisp風味の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

ケンの右、ちょうどデフ*フォームに簡単にいくつかの変更、およびドキュメンテーション文字列の異なるスタイル(ドキュメンテーション文字列は、通常のVARSよりも関数定義のビット単純です):

(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*) 
関連する問題