سؤال

ما هو الخطأ في هذا الرمز في Dr.Scheme باستخدام كبير كبير؟ يبدو أنني أتذكر القيام بأشياء مماثلة في الماضي دون أي مشكلة.

(lambda (x y) (set! (Frame-variables res) (append (Frame-variables res) (list (cons x y)))))

الذي يعيد الخطأ التالي:

set!: not an identifier in: (Frame-variables res)

إذا حذفت (set! (Frame-variables res) ... ) الجزء الذي يعمل بشكل جيد إلا بالطبع أن قائمتي لا تتغير بالفعل. لذلك تعترف الثانية (Frame-varialbes res) ولكن ليس أول واحد؟ أو ما هي الصفقة مع set! في هذا السياق؟

نأمل أن تدرك أن لدي بنية تسمى Frame مع variables الحقل الذي هو قائمة.

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

المحلول

المشكلة:

كيف تم تعيين! يعمل. ما يفعله حقا هو ربط اسم كائن شنقا في الذاكرة في مكان ما. عند تعيين!، يغير ما يشير إليه هذا الاسم.

هذا الخطأ: (Frame-variables res) ليس معرفا، لذلك لا يمكن أن يجعله يشير إلى شيء آخر.

المأزق:

ما تحاول القيام به هو التحور عضو في بنية. ما عليك القيام به هو تغيير عضو هيكل أن يكون قابلة للتغيير، ثم استخدم الخوخ الذي سيتم إجراؤه.

(define-struct frame (a b ... c [variables #:mutable] e ...))

ثم، يمكنك استخدام

(set-frame-variables! res (list "new" "value"))

هذا سوف يتحول هيكلك حسب الرغبة.

المحاضرة:

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

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

الوثائق ذات الصلة:

http://docs.plt-scheme.org/Reference/Define-Sted.html#(Form._((LIB._SCHEME/BASE..SS )_DeFine-Strent))

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