المخطط: لماذا هناك الحاجة إلى استخدام كوند هنا؟
-
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;
}
}