2010-12-31 13 views
11

Sto leggendo Paradigmi di Intelligenza Artificiale Programmando (PAIP) di Peter Norvig e sto provando a scrivere tutto il codice in Clojure piuttosto che Common Lisp. Tuttavia sono bloccato su questo pezzo di codice a pagina 39:Porting un pezzo di codice Lisp in 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*) 

Come posso tradurre questo in Clojure? Grazie.

+0

Non conosco Clojure, ma non elenca i letterali allo stesso modo? Cambia semplicemente 'defparameter' in' def'. Sembra che le docstring siano fornite in un modo diverso, però, e non ne sono sicuro ... – Ken

+0

Guardando http://norvig.com/paip/simple.lisp, che è la fonte del tuo codice, * appare * che -> non è usato nel codice attuale, ma agisce come zucchero sintattico per la lista di liste lassù. –

+1

Ho fatto un po 'di paip in clojure (più a venire) https://github.com/nickik/ParadigmsOfAIProgramming – nickik

risposta

12

Sono un novizio Clojure relativo che ha subito questo esatto esercizio. Qualcosa da considerare qui è se ti piacerebbe aderire il più vicino possibile al codice di Norvig (come scrivere Clojure "Common-Lisp-flavoured") o se ti piacerebbe scrivere qualcosa di più vicino al Clojure idiomatico. Ecco quello che ho fatto:

(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 è lo zucchero che ti permette di aggiungere docstring a Vars in modo più naturale. In questo caso sto usando una mappa (coppie di valori chiave delimitati da {}) per ottenere la ricerca in stile dizionario dall'LHS di ogni regola all'RHS. Sto anche usando i vettori (delimitati da []) invece delle liste per rappresentare l'RHS di ogni regola. In generale, il codice Clojure "idiomatico" utilizza raramente elenchi per contenere dati sequenziali; i vettori sono preferiti a meno che tu non stia rappresentando i moduli Clojure (codice sorgente).

Questi tipi di modifiche ti permetteranno di usare più della potenza incorporata del linguaggio invece di, per esempio, dover scrivere piccole funzioni di supporto per manipolare gli elenchi annidati.

+0

Grazie mille Mike. –

5

destra di Ken, un semplice paio di modifiche alle forme def *, e un diverso stile di docstring (docstrings sono un po 'più semplice per definizioni di funzioni che per Vars normali):

(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*) 
Problemi correlati