2010-12-31 7 views
11

पर लिस्प कोड का एक टुकड़ा पोर्टिंग मैं पीटर नॉर्विग द्वारा (PAIP) के पैराडिग्म्स पढ़ रहा हूं और मैं सामान्य लिस्प के बजाय क्लोजर में सभी कोड लिखने की कोशिश कर रहा हूं। हालांकि मैं पेज 3 9:क्लोजर (पीएआईपी)

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

मैं क्लोजर में इसका अनुवाद कैसे कर सकता हूं? धन्यवाद।

+0

मुझे क्लोजर नहीं पता है, लेकिन क्या यह लिस्ट लिस्टल को उसी तरह उद्धृत नहीं करता है? बस 'defparameter' को' def' में बदलें। ऐसा लगता है कि डॉकस्ट्रिंग को एक अलग तरीके से आपूर्ति की जाती है, हालांकि, और मुझे इसके बारे में निश्चित नहीं है ... – Ken

+0

http://norvig.com/paip/simple.lisp पर देख रहे हैं, जो आपके कोड का स्रोत है, यह * प्रकट होता है * वह -> वास्तविक कोड में उपयोग नहीं किया जाता है, लेकिन वहां सूचियों की सूची के लिए वाक्य रचनात्मक चीनी के रूप में कार्य करता है। –

+1

मैंने क्लोजर में कुछ पैप बनाया (अधिक आने के लिए) https://github.com/nickik/ParadigmsOfAIProgramming – nickik

उत्तर

12

मैं एक हूँ रिश्तेदार क्लोजर नौसिखिया जो कुछ समय पहले इस सटीक अभ्यास के माध्यम से चला गया था। यहां पर विचार करने के लिए कुछ है कि क्या आप Norvig के कोड (जैसे "आम-लिस्प-स्वाद" क्लोजर लिखना चाहते हैं) या यदि आप मूर्खतापूर्ण क्लोजर के करीब कुछ लिखना चाहते हैं। यहां मैंने किया है:

(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.") 

डिफवर चीनी है जो आपको अधिक स्वाभाविक रूप से नृत्यों में डॉकस्ट्रिंग जोड़ने की अनुमति देता है। इस मामले में मैं प्रत्येक नियम के एलएचएस से आरएचएस तक डिक्शनरी-स्टाइल लुकअप प्राप्त करने के लिए एक मानचित्र (कुंजी मूल्य जोड़े {} द्वारा सीमित) का उपयोग कर रहा हूं। मैं प्रत्येक नियम के आरएचएस का प्रतिनिधित्व करने के लिए सूचियों के बजाय वैक्टरों ([] द्वारा सीमित] का उपयोग कर रहा हूं। आम तौर पर, "idiomatic" क्लोजर कोड अनुक्रमिक डेटा रखने के लिए शायद ही सूचियों का उपयोग करता है; वैक्टर को तब तक प्राथमिकता दी जाती है जब तक आप क्लोजर फॉर्म (स्रोत कोड) का प्रतिनिधित्व नहीं कर रहे हों।

इस प्रकार के परिवर्तन आपको भाषा की अंतर्निहित शक्ति का अधिक उपयोग करने की अनुमति देंगे, उदाहरण के लिए, नेस्टेड सूचियों में हेरफेर करने के लिए छोटे सहायक कार्यों को लिखना।

+0

धन्यवाद बहुत माइक। –

5

केन के अधिकार, डीईएफ़ * रूपों के लिए सिर्फ एक सरल कुछ परिवर्तन, और docstring की एक अलग शैली (docstrings सामान्य वार्स के लिए की तुलना में समारोह परिभाषा के लिए थोड़ा आसान कर रहे हैं):

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