2009-06-30 6 views
5

योजना में ऑटो-मेमोइज़र लिखते समय मुझे कुछ समस्याएं आ रही हैं।योजना में एक ऑटो-मेमोइज़र लिखना। मैक्रो और एक रैपर के साथ सहायता

मेरे पास एक काम करने वाला ज्ञापन फ़ंक्शन है, जो हैश तालिका बनाता है और जांच करता है कि मान पहले से गणना की गई है या नहीं। यदि इससे पहले गणना की गई है तो यह उस मूल्य को वापस कर देता है जो इसे फ़ंक्शन कहते हैं। उम्मीद है कि एक मैक्रो डीईएफ़-ज्ञापन जो memoize-आवरण के साथ समारोह को परिभाषित करता है कहा जाता है बनाने

(define (memoize-wrapper function) 
    (set! function (memoizer function))) 

और:

(define (memoizer fun) 
    (let ((a-table (make-hash))) 
    (λ(n) 
     (define false-if-fail (λ() #f)) 
     (let ((return-val (hash-ref a-table n false-if-fail))) 
     (if return-val 
      return-val 
      (begin 
       (hash-set! a-table n (fun n)) 
       (hash-ref a-table n))))))) 

अब मैं इस तरह एक memoize-आवरण समारोह बनाना चाहते हैं। जैसे। मैक्रो को (memoizer का विस्तार कर सकता है (इस तरह परिभाषित समारोह-नाम तर्क शरीर ...) या कुछ और

तो यह है कि मैं ऐसा करने में सक्षम होना चाहिए:।

(def-memo (factorial n) 
    (cond 
    ((= n 1) 1) 
    (else (* n (factorial (- n 1)))))) 

जिनमें से एक memoized संस्करण बनाना चाहिए बजाय सामान्य धीमी गति से एक के भाज्य।

मेरे समस्या यह है कि

  1. memoize-आवरण ठीक से काम नहीं कर रहा है, यह does not memoized समारोह लेकिन मूल फ़ंक्शन को कॉल करें ।
  2. मुझे नहीं पता कि मैक्रो के अंदर परिभाषित कैसे करें। मैं कैसे सुनिश्चित कर सकता हूं कि मैं परिवर्तनीय लंबाई तर्क और परिवर्तनीय लंबाई शरीर प्राप्त कर सकता हूं? फिर मैं फ़ंक्शन को परिभाषित कैसे करूं और इसे यादगार के साथ लपेटूं?

बहुत बहुत धन्यवाद।

उत्तर

6

इस मैं PLT योजना में क्या उपयोग है:

#lang scheme 

(define (memo f) 
    (define mh (make-hash)) 
    (lambda p 
    (hash-ref mh p (lambda() 
        (hash-set! mh p (apply f p)) 
        (hash-ref mh p))))) 

(define-syntax-rule (defmemo (id . p) . body) 
    (define id (memo (lambda p . body)))) 

(provide defmemo) 
+0

वाह। यह सिर्फ कमाल है। क्या आप संक्षेप में अपने कोड को विशेष रूप से मैक्रो बिट पर टिप्पणी कर सकते हैं। वहां क्यों हैं ? आपने क्यों प्रदान किया और क्या आपको वास्तव में आवेदन करने की ज़रूरत है? मैं एक नौसिखिया हूँ। धन्यवाद। पैरामीटर सूची में – unj2

+1

। इंगित करता है कि निम्न चर एक से अधिक चीज़ों से बंधे हैं। मैक्रो में, पी पैराम्स की एक सूची है, न केवल एक ही param (शरीर अभिव्यक्तियों की एक सूची है)। फ़ंक्शन में वही बात, पी लागू करने के लिए लागू होती है, पैरा की सूची, फ़ंक्शन f। –

+0

यह भी देखें: http://planet.plt-scheme.org/display.ss?package=memoize.plt&owner=dherman –

संबंधित मुद्दे