سؤال

حسنًا ، قد يبدو هذا وكأنه سؤال مثير للسخرية ، ولكن كيف يمكنك إرجاع قائمة في المخطط.؟

لا يوجد حل صحيح

نصائح أخرى

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

على المستوى الذي تتعلمه (Novice) ، كل وظيفة تكتبها لها مدخلات وإخراج ، وجسم كل وظيفة هو تعبير واحد. مهما كانت القيمة التي يقيمها التعبير يتم إرجاعها بواسطة الوظيفة. ليست هناك حاجة إلى "إرجاع" أي شيء بشكل صريح كما تفعل في لغة ضرورية مثل Java أو C ؛ يحدث فقط كنتيجة مباشرة لتقييم التعبير.

جسم الوظيفة هو تعبير واحد. لا يشبه Java حيث يتكون جسم الطريقة من سلسلة من التعليمات:

do this
then do that
then do something else
then return something (maybe)

وظائف المخطط تقييم تعبير واحد. لا شيء آخر. إليك وظيفة بسيطة تضيف 5 إلى أي رقم يتم تمريره كوسيطة:

(define (add5 x)
  (+ x 5))

جسم الوظيفة (+ x 5), ، وهو مجرد تعبير ليتم تقييمه. قيمة ال x تم توصيله ، + (إضافة) يتم تطبيق الوظيفة على x و 5 ، ويتم إرجاع النتيجة.

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

إليك وظيفة تستهلك رقمًا n ويبني القائمة (n n-1 n-2 ... 0)

(define (makelist n)
  (if (= n 0)
     (list 0)                       ; base case. Just return (0)
     (cons n (makelist (- n 1)))))  ; recursive case. Add n to the head of (n-1 n-2 ... 0)

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

هذا مثال آخر. هذا واحد يستخدم لدينا add5 وظيفة لإضافة 5 إلى كل عنصر من عناصر الأرقام (LON):

(define (add5list lon)
  (if (null? lon)
    `()                 ; base case: lon is empty. Return an empty list.
    (cons (add5 (car lon)) (add5list (cdr lon)))))  ; recursive case.
                                                    ; Add 5 to the head of lon and prepend it to the tail of lon

مرة أخرى ، تعود كل من الحالات الأساسية والحالات العودية عن طريق تقييم التعبيرات التي تؤدي إلى قوائم.

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

ربما تريد ببساطة: '(2 3 5 7 11) أو (list 2 3 5 7 11)?

يمكنك أيضًا إنشاء قوائم عن طريق تحديد عنصر وقائمة لإضافته إلى: (cons 2 (cons 3 '()))

إليك مثال على إرجاع قائمة من وظيفة:

(define returnlist 
  (lambda(a b c) 
    (cons a (cons b (cons c '())))
))

(returnlist 2 3 4)

ستكون قيمة الإرجاع هي القائمة: (list 2 3 4)

طريقة أخرى غير معروفة للقيام بذلك:

> ((lambda x x) 2 3 5 7 11)
(2 3 5 7 11)

أي أن وظيفة "القائمة" نفسها يمكن تعريفها على النحو التالي:

> (define list (lambda x x))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top