المخطط: لماذا هناك الحاجة إلى استخدام كوند هنا؟

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

  •  21-09-2019
  •  | 
  •  

سؤال

حاولت أن أكتب (بسيط ، أي بدون eqan?) one? وظيفة مثل هذه:

(define one?
  (lambda (n)
    ((= 1 n))))

لكن ما سبق لا يعمل لأنه عندما أسميها مثل هذا:

(one? 1)

استقبلت هذا الخطأ:

procedure application: expected procedure, given: #t (no arguments)

الطريقة الصحيحة (من المخطط الصغير) لكتابتها هي:

(define one?
  (lambda (n)
    (cond
      (else (= 1 n)))))

لماذا هناك حاجة لاستخدام أ cond مع ال else بند ، بدلاً من مجرد العودة (= 1 n) ?

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

المحلول

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

الرد على ملاحظتك أعلاه: لا يعمل لأن لديك مجموعة إضافية من الأقواس في جسم Lambda. يجب أن يكون

(lambda (n) (= 1 n))

الأقواس الإضافية في نسختك تعني أنه بدلاً من إرجاع القيمة #t أو #f, ، أنت تحاول استدعاء هذه القيمة كدالة بدون وسيطات.

نصائح أخرى

عدم وجود نسخة من المخطط الصغير في متناول اليد ، يبدو مثالك كما لو كان يجب أن يعمل. اعتقد ان cond غريب. في psudeo-c ، يكون equivant (مع كوند) هو:

int
one(int n)
{     
    switch (foo) {
        default:
           return  1 == n;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top