ما هي بعض الأشياء التي كنت قد استخدمت نظام وحدات الماكرو ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/245677

  •  05-07-2019
  •  | 
  •  

سؤال

العديد من الأمثلة على وحدات الماكرو يبدو حول إخفاء lambdas مثلامع فتح ملف في CL.أنا أبحث عن بعض أكثر غرابة تستخدم وحدات الماكرو ، خاصة في PLT المخطط.أود أن تشعر عند النظر في استخدام ماكرو مقابلباستخدام وظائف.

هل كانت مفيدة؟

المحلول

وأنا فقط استخدام وحدات الماكرو مخطط (define-syntax) لأشياء صغيرة مثل تركيب لامدا أفضل:

(define-syntax [: x]
  (syntax-case x ()
    ([src-: e es ...]
     (syntax-case (datum->syntax-object #'src-: '_) ()
       (_ #'(lambda (_) (e es ...)))))))

والذي يتيح لك كتابة

[: / _ 2]  ; <-- much better than (lambda (x) (/ x 2))

ودان فريدمان لديه التنفيذ العقل والانحناء من OO باستخدام وحدات الماكرو: HTTP: // www.cs.indiana.edu/~dfried/ooo.pdf

ولكن بصراحة، وسرقت جميع <م> المفيدة وحدات الماكرو لقد المحددة من يوم بول غراهام ثغة و عادة ما تكون أسهل في الكتابة مع defmacro (define-macro في مخطط PLT). على سبيل المثال، aif هو قبيح جدا مع define-syntax.

(define-syntax (aif x)
  (syntax-case x ()
    [(src-aif test then else)
     (syntax-case (datum->syntax-object (syntax src-aif) '_) ()
       [_ (syntax (let ([_ test]) (if (and _ (not (null? _))) then else)))])]))

وdefine-syntax أمر غريب لأنه من السهل فقط لاستخدام وحدات الماكرو بسيطة جدا، حيث كنت سعيدا لعدم القدرة على التقاط المتغيرات. وتراخيص اشتراك الجهاز الكلي معقدة للغاية، حيث كنت سعيدا لعدم القدرة على التقاط المتغيرات <م> بسهولة . في الحالة الأولى كنت تريد أن تكتب الرمز دون التفكير فيه، وفي الحالة الثانية كنت قد فكرت بما فيه الكفاية حول DSL ان كنت على استعداد لكتابة جزء منه باللغة syntax-rules / syntax-case وهي ليست خطة لتفادي البق حيرة.


ولكن أنا لا تستخدم وحدات الماكرو التي كثيرا في مخطط. نظام اصطلاحي وظيفية حتى أن العديد من المرات كنت ترغب فقط في كتابة برنامج وظيفي ومن ثم إخفاء بعض lambdas. حصلت على متن القطار وظيفية ونعتقد الآن أنه إذا كان لديك لغة كسول أو تركيب جيدة لامدا، حتى أن ليس من الضروري، لذلك وحدات الماكرو ليست كل ما يفيد في طراز عملي بحت.

ولذا فإنني أنصح عملي اللثغة المشتركة و <لأ href = "http://paulgraham.com /onlisp.html "يختلط =" noreferrer "> في اللثغة . إذا كنت ترغب في استخدام نظام PLT، وأعتقد أن معظم وحدات الماكرو defmacro بهم سوف تعمل مع define-macro. أو مجرد استخدام اللثغة المشتركة.

نصائح أخرى

وهناك حاجة

وحدات الماكرو من أجل تنفيذ هياكل المراقبة الجديدة ويبني ملزمة جديدة.

وهكذا ننظر لهذه الأنواع من يبني على http://planet.plt-scheme.org . في كوكب لكم على حد سواء تصفح وثائق والتعليمات البرمجية.

وأمثلة لهياكل المراقبة الجديدة:

http://planet.plt-scheme.org/package-source/soegaard/control.plt/2/0/planet-docs/manual/index.html

لتجد أمثلة على أشكال ملزمة جديدة، والبحث عن وحدات الماكرو التي تبدأ ب "مع-". تم العثور على أحد مثالا مفيدا في math.plt أيضا من كوكب الأرض.

  ; Within a (with-modulus n form1 ...) the return values of
  ; the arithmetival operations +, -, * and ^ are automatically
  ; reduced modulo n. Furthermore (mod x)=(modulo x n) and
  ; (inv x)=(inverse x n).

  ; Example: (with-modulus 3 (^ 2 4)) ==> 1

  (define-syntax (with-modulus stx)
    (syntax-case stx ()
      [(with-modulus e form ...)
       (with-syntax ([+   (datum->syntax-object (syntax with-modulus) '+)]
                     [-   (datum->syntax-object (syntax with-modulus) '-)]
                     [*   (datum->syntax-object (syntax with-modulus) '*)]
                     [^   (datum->syntax-object (syntax with-modulus) '^)]
                     [mod (datum->syntax-object (syntax with-modulus) 'mod)]
                     [inv (datum->syntax-object (syntax with-modulus) 'inv)])
         (syntax (let* ([n e]
                        [mod    (lambda (x)   (modulo x n))]
                        [inv    (lambda (x)   (inverse x n))]
                        [+      (compose mod +)]
                        [-      (compose mod -)]
                        [*      (compose mod *)]
                        [square (lambda (x) (* x x))]
                        [^      (rec ^ (lambda (a b)
                                         (cond
                                           [(= b 0)   1]
                                           [(even? b) (square (^ a (/ b 2)))]
                                           [else      (* a (^ a (sub1 b)))])))])
                   form ...)))]))

وسأبدأ بالإجابة على السؤال الأخير. عندما استخدام ماكرو بدلا من وظيفة. وحدات الماكرو تفعل أشياء وظائف لا يمكن، وظائف تفعل شيئا وحدات الماكرو لا يمكن، لذلك سوف يكون من الصعب مزجها، ولكن دعونا نذهب أعمق.

ويمكنك استخدام وظائف عندما تريد الحجج تقييم وحدات الماكرو عندما تريد الحجج برنامج الأمم المتحدة للتقييم. هذا ليس من المفيد جدا، أليس كذلك؟ يمكنك استخدام وحدات الماكرو عندما تريد أن تكتب شيء بطريقة مختلفة، عندما ترى وجود نمط وتريد مجردة. على سبيل المثال: I تحديد ثلاث وظائف دعا فو خلق، فو العملية وفو تدمير لقيم مختلفة من فو ومع الهيئات المماثلة حيث التغيير الوحيد هو فو. هناك نمط ولكن على مستوى رفيع جدا عن وظيفة، لذلك قمت بإنشاء ماكرو.

في تجربتي المتواضعة، وحدات الماكرو في برنامج هي لاستخدامها بقدر ما في اللثغ الأخرى، مثل اللثغة المشتركة أو كلوجر . أعتقد أنه دليل على أن وحدات الماكرو ربما صحية ليست هذه فكرة جيدة، وهنا أود أن أختلف مع بول جراهام عن السبب. انها ليست لأن في بعض الأحيان كنت تريد أن تكون قذرة (غير صحية)، ولكن لأن وحدات الماكرو صحية في نهاية الأمر تعقيدا أو الملتوية.

والعملية اللثغة المشتركة، بيتر سيبل، لديه مقدمة جيدة إلى وحدات الماكرو. على اللثغة، بول غراهام، قد يكون مصدرا جيدا للأمثلة أكثر تعقيدا. أيضا، لدينا نظرة على وحدات الماكرو المضمنة في، ويقول، اللثغة المشتركة.

التشغيل الذاتي عن طريق وحدات الماكرو تقدم ورقة لؤلؤة برمجة وظيفية على تنفيذ أجهزة الدولة محدودة عبر وحدات الماكرو في مخطط.

والمبرر مدبر المكائد ينتهي تنفيذ القائم على ماكرو الكامل للminiKanren، لغة البرمجة المنطقية المستخدمة في الكتاب. هذه الورقة يقدم miniKanren وتنفيذها بصورة أكثر رسمية ودقة مما كانت عليه في الكتاب.

مثال أكثر تقدما الكلي الذي لا امدا شكل مقنعة هو Common Lisp الكلية مع فتحات, مما يجعل وجوه فتحة الوصول تبدو عادية متغير الوصول:

(with-slots (state door) car
  (when (eq state :stopped)
    (setq state :driving-around)
    (setq door :closed)))

لاحظ أن هذا ليس هو نفسه كما ربط فتحة القيم إلى المتغيرات المحلية والوصول إلى تلك ، مع فتحات يسمح لك لتغيير فتحات عن طريق SETQ ومعرفة التغيرات الخارجية على الفور.

وكان لي ماكرو curry عندما كنت تفعل الكثير من مخطط على كفي. وكان مفيد جدا.

وحدات الماكرو مخطط تتيح لك إضافة الميزات التي المؤلفين باللغة الأصلية لم تتضمن أنفسهم. وهذا هو فلسفة كلها وراء وحدات الماكرو.

وهنا مثال صغير: يوفر نظام PLT لغة للكتابة العروض ودعا عرض الشرائح. اعتدت وحدات الماكرو لربط رقم الشريحة مع شريحة كي أتمكن من أكثر سهولة إدارتها.

ولقد كتبت ماكرو التي توفر جملة أقحم. لا شيء يتوهم جدا. لا الأسبقية. بينما أنا بخير عموما مع تركيب البادئة، لكنني أفضل أقحم ل <و>.

وأنا استخدامها عندما لا تكفي الإجراءات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top