مبتدئ في اللثغة المشتركة:سؤال ماكرو لتحديد الحزم على الطاير

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

  •  07-07-2019
  •  | 
  •  

سؤال

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

(defmacro def-dynamic-package (name)
  `(defpackage ,(intern (string-upcase name) "KEYWORD")
     (:use :common-lisp)))

يعمل هذا بشكل جيد فقط مع تعبيرات مثل:

(def-dynamic-package "helloworld")

لكنه فشل فشلا ذريعا لشيء من هذا القبيل:

(defun make-package-from-path (path)
  (def-dynamic-package (pathname-name path)))

أو

(defun make-package-from-path (path)
  (let ((filename (pathname-path)))
     (def-dynamic-package filename)))

أنا أفهم كيفية عمل معظم وحدات الماكرو الأساسية ولكن كيفية تنفيذ هذا الأمر تغيب عني.

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

المحلول

com.defpackage هو ماكرو.على هذا النحو، يتم توسيعه في وقت الترجمة، وليس وقت التشغيل.ما تريده هو شيء يتم استدعاؤه في وقت التشغيل لإنشاء حزمة جديدة.لذلك، com.defpackage لا أستطيع أن أفعل أي شيء بالنسبة لك.

لحسن الحظ، هناك أيضا حزمة, ، الذي يقدم com.defpackageميزات كوظيفة.استخدامه بدلا من com.defpackage.

نصائح أخرى

والفشل المتوقع هنا، لأنه يتم استخدام ماكرو عندما لا ينبغي تقييم حجتها.

في الاشتراك في أول المكياج حزمة من مسار، فإن حزمة مواطنه الديناميكي يحصل كوسيطة قائمة التي تساوي قيمة التعبير التالي:

(list 'pathname-name 'path)

في قضيتك، وتريد فقط وظيفة:

(defun def-dynamic-package (name)
  (defpackage (string-upcase name)
    (:use :common-lisp)))

وراجع للشغل، إذا قمت بالتدقيق في CLHS أو عليك نرى أن الحجة الأولى من defpackage لا يلزم أن يكون رمزا، ولكن أي سلسلة التسمية .

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