سؤال

(تنويه:أنا C# الرجل.لقد بدأت للتو تعلم Clojure.)

أنا أفهم أن Clojure البرنامج لديه القدرة على التعامل مع نفسها أو بسهولة إنشاء الأخرى برامج.قد تفعل شيئا مع كل شيء في Clojure كونه بنية البيانات و توليد برامج سيكون نفس خلق أي نوع آخر من بنية البيانات.

لا أحد لديك عينة جيدة البرنامج (أو إشارة إلى واحد) أن يدل هذا ؟

إذا كنت توليد البرنامج, يمكنك "تسلسل" هذا البرنامج إلى القرص في وقت لاحق التنفيذ ؟

فقط للإشارة:

  1. أنا أحاول اللعب مع البرمجة الجينية.أريد أن تولد الكثير من البرامج وتقييمها ، واستخدام الناجحة منها لتوليد المزيد من البرامج.انظر أكثر هنا و هنا.

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

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

المحلول

النظر في (+ 1 2).حسب المعلومات انها قائمة مرتبطة من ثلاثة بنود:الرمز + واثنين من الاعداد الصحيحه.كما رمز ، إنها وظيفة الدعوة قائلا "استدعاء دالة تسمى + مع اثنين من هذه الاعداد الصحيحه كما الحجج و تعطيني النتيجة".يمكنك أن تفعل أي شيء في هذه القائمة التي يمكنك القيام به في أي قائمة أخرى من البيانات.يمكنك أيضا eval للحصول على النتيجة.

user> (def x '(+ 1 2))
#'user/x
user> (first x)
+
user> (rest x)
(1 2)
user> (map class x)
(clojure.lang.Symbol java.lang.Integer java.lang.Integer)
user> (reverse x)
(2 1 +)
user> (concat x (rest x))
(+ 1 2 1 2)
user> (eval x)
3
user> (defn foo []
        (let [ops '[+ - * /]               ; SO's lisp-highlighting sucks
              nums (repeatedly #(rand-int 5))
              expr (list* (rand-elt ops) (take 10 nums))]
          (prn expr)
          (prn (eval expr))))
user> (foo)
(+ 4 1 0 3 2 3 4 3 1 2)
23
nil
user> (foo)
(- 1 3 2 2 1 2 1 4 0 1)
-15
nil

نصائح أخرى

Clojure هو يسب و هذا يعني أنه هو homoiconic اللغة:لا يوجد هيكلية التمييز بين البيانات و التعليمات البرمجية.قوائم طول الطريق.كما أن لديها الموسعة المترجم الذي يسمح لك لتوسيع بناء الجملة من خلال وحدات الماكرو.ولكن ليس من الواضح من بيان المشكلة التي تحتاج حقا شيء من هذا القبيل.

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

وجدت الإجابة الجزئية في هذا المادة:

على pr و prn وظائف مثل الطباعة و println النظراء ، ولكن إنتاجها في شكل يمكن أن أن تقرأ Clojure القارئ.أنها هي مناسبة التسلسلية Clojure هياكل البيانات.بشكل افتراضي, يفعلون لا تتم طباعة البيانات الوصفية.هذا يمكن أن يكون تغيير ملزمة رمز خاص *print-meta* إلى true.

هذا على الأقل إجابات الجزء الثاني من سؤالي.

السؤال مضلل إلى حد ما كما Clojure يؤدي أيضا على ذبابة "إنشاء رمز" كما يجمع Clojure مصدر في جافا بايت كود.

في هذه الحالة بالذات ، أعتقد كنت مثيرة للاهتمام في اللثغة وحدات الماكرو بصفة خاصة.أعتقد أن هذه قد تكون مثيرة للاهتمام:

Clojure الوثائق نفسها

الفيديو, وحدات الماكرو (في Clojure) في 20 دقيقة

مستوى المشكلة:ويكيبيديا - Clojure

علما بأن وحدات الماكرو في Clojure العمل مشابهة جدا إلى Common Lisp وحدات الماكرو (نوع-2 اللثغة) ، ليس تماما-كثيرا-مثل مخطط وحدات الماكرو.

سعيد الترميز.

نلقي نظرة على وحدات الماكرو.على سبيل المثال ،

(defmacro defmacro-
  "Same as defmacro but yields a private definition"
  [name & decls]
  (list* `defmacro (with-meta name (assoc (meta name) :private true)) decls))

مع وحدات الماكرو لا تحتاج إلى تسلسل من macroexpansion;ترجمة استخدامه تلقائيا.

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