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.
fonte
2011-01-01 03:50:29
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
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ù. –
Ho fatto un po 'di paip in clojure (più a venire) https://github.com/nickik/ParadigmsOfAIProgramming – nickik