اللثغة المشتركة: مشكلة المبتدئين مع funcall

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أحاول لتمرير وظيفة كحجة وندعو إلى أن وظيفة في وظيفة أخرى.

وقطعة من قانون بلدي يبدو مثل هذا:

(defun getmove(strategy player board printflag)
(setq move (funcall strategy player board))
(if printflag
    (printboard board))

ويتم تمرير استراتيجية كرمز ممثلة في قائمة الأبعاد كشيء مثل 'randomstrategy

وأظل الحصول على الخطأ: "FUNCALL:" RANDOMSTRATEGY ليس اسم الوظيفة، حاول استخدام رمز بدلا من ذلك ...

عند يمكنني استبدال استراتيجية مع "randomstrategy أنه يعمل بشكل جيد. يمكنني أيضا استدعاء randomstrategy بشكل مستقل. ما هي المشكلة؟

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

المحلول

وهو stategy متغير مع قيمة وظيفية؟ إن لم يكن من استخدام # 'ماكرو في بناء الجملة قبل ذلك. وهذا هو استراتيجية # '. أو مجرد (إذا هي وظيفة العالمية) "استراتيجية

لماذا؟ لأن حجج دعوة funcall evaluted. ورمز الاستراتيجية الخاصة بك هو مجرد اسم المتغير في هذه الحالة. Variabe هذه القيمة "RANDOMSTRATEGY. ولكن يجب أن تعطي لfuncall وظيفة. كيفية الوصول إلى وظيفة إذا كان لدينا رمز؟

وثلاث حالات:

1) Symbol may denote variable with functional value
2) Symbol may denote global function (symbol-function - is the accessor in this case.
3) Symbol may denote local function (flet, labels and so on)

وتبدو وكأنك نسيت أن تحدد وظيفة RANDOMSTRATEGY

و(defun RANDOMSTRATEGY وهلم جرا ...)

وهم

FUNCALL: 'RANDOMSTRATEGY

قد يكون لديك (استراتيجية setq '' RANDOMSTRATEGY)؟

وبعد ذلك سوف استراتيجية تقييم إلى 'RANDOMSTRATEGY. هل لاحظت "قبل اسم الرمز؟ "RANDOMSTRATEGY <=> (اقتبس RANDOMSTRATEGY) ليس اسم دالة الصحيح

نصائح أخرى

والمشكلة هي أن strategy متغير لا يحتوي على randomstrategy رمز وإنما قائمة (!) 'randomstrategy (وهو التدوين المختصر ل(quote randomstrategy)).

والآن، أنت <م> قد ، بطبيعة الحال، استخراج رمز من القائمة عن طريق لsecond وظيفة، ولكن هذا لن يؤدي إلا إلى تغطية المشكلة الحقيقية تصل، الذي هو على الارجح في مكان ما في سلسلة المكالمة. محاولة لتحديد سبب الحجة التي يتم تمريرها إلى وظيفة getmove هي 'randomstrategy، وليس randomstrategy كما ينبغي أن يكون. (ربما استخدمته خطأ اقتباس داخل قائمة نقلت؟)

وأوه، ولا تسمح لنفسك في حيرة من حقيقة أن (funcall 'randomstrategy ...) يعمل: على 'randomstrategy التعبير لا، بعد كل شيء، وتقييم لنفسها، ولكن لrandomstrategy رمز

هل وضعت استراتيجية في أي مكان؟ يبدو أن مسألة تحديد النطاق.

وهذه محاولة

(setq strategy 'randomstrategy)
(setq move (funcall strategy player board))

وليس رؤية رمز، وأنا أتخيل كنت تفعل شيئا من هذا القبيل:

و(defun randomstrategy (أ ب ج) ...)

وثم القيام بذلك:

و(getmove "randomstrategy X Y Z)

وما تريد القيام به هو تمرير وظيفة "randomstrategy" لgetmove باستخدام # ':

و(getmove # 'randomstrategy X Y Z)

في CommonLisp، # 'غلة وظيفة منضمة إلى رمز، وهو ما كنت تريد تمريرها إلى getmove.

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