هل يوجد مثل هذا الإجراء في مخطط قياسي، وإذا كانت الإجابة بنعم، كيف يتم تسميته؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

لقد بحثت عن اسم الإجراء، الذي يطبق بنية شجرة من الإجراءات على بنية شجرة من البيانات، مما يؤدي إلى بنية شجرة من النتائج - جميع الأشجار الثلاثة لها نفس البنية.

قد يكون لمثل هذا الإجراء التوقيع:

(map-tree data functree)

ستكون قيمة الإرجاع الخاصة بها نتيجة التطبيق العنصري لعناصر functree على عناصر البيانات المقابلة.

أمثلة (على افتراض أن الإجراء يسمى شجرة الخريطة):

مثال 1:

(define *2 (lambda (x) (* 2 x)))
; and similar definitions for *3 and *5

(map-tree '(100 (10 1)) '(*2 (*3 *5)))

سوف تسفر عن النتيجة

(200 (30 5))

مثال 2:

(map-tree '(((aa . ab) (bb . bc)) (cc . (cd . ce)))
        '((car cdr) cadr))

يعطي النتيجة

((aa bc) cd)

ومع ذلك، لم أجد مثل هذه الوظيفة في وثائق SLIB، التي قمت بمراجعتها.

هل مثل هذا الإجراء موجود بالفعل؟
إذا لم يكن الأمر كذلك، فما هو الاسم المناسب للإجراء، وكيف يمكنك ترتيب حججه؟

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

المحلول

ليس لدي اسم جيد جدًا لهذه الوظيفة.أقوم بلصق تطبيقي أدناه (لقد أسميته map-traversing;يجب على الآخرين اقتراح اسم أفضل).لقد جعلت ترتيب الوسيطة يعكس ذلك map بحد ذاتها.

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (func data)))

باستخدام بيانات العينة الخاصة بك، لدينا:

(map-traversing `((,car ,cdr) ,cadr) '(((aa . ab) (bb . bc)) (cc cd . ce)))

تتطلب العينة الثانية SRFI 26.(يسمح بالكتابة (cut * 2 <>) بدلاً من (lambda (x) (* 2 x)).)

(map-traversing `(,(cut * 2 <>) (,(cut * 3 <>) ,(cut * 5 <>))) '(100 (10 1)))

الشيء الأكثر أهمية هو أن جميع وظائفك يجب أن تكون غير مقتبسة، على عكس المثال الخاص بك.

نصائح أخرى

لقد وجدت أنه مع التعريف التالي لاجتياز الخريطة، لا تحتاج إلى إلغاء اقتباس الوظائف:

(define (map-traversing func data)
  (if (list? func)
      (map map-traversing func data)
      (apply (eval func (interaction-environment)) (list data))))

ملحوظة:في الإصدار المثبت من Guile، لسبب ما، فقط (بيئة التفاعل) لا يثير خطأ المتغير غير المنضم.البيئات الأخرى أي.(تقرير المخطط - البيئة 5) و (البيئة الخالية 5) يثير هذا الخطأ.

ملاحظة 2:بعد ذلك، وجدت في [1] أنه لكي تعمل (Scheme-report-environment 5) و (null-environment 5)، تحتاج أولاً إلى (استخدام الوحدات النمطية (ice-9 r5rs))

[1]: http://www.mail-archive.com/bug-guile@gnu.org/msg04368.html 'يكرر:guile -c "(Scheme-report-environment 5)" ==> خطأ:متغير غير منضم:مخطط-تقرير-بيئة"

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