سؤال

لماذا يجب علي استخدام # 'جنبا إلى جنب مع Lambda؟ عادة ما يتم كتابته بهذه الطريقة، لذلك أعتقد أنه شكل جيد. لكن هذه الخطوط تبدو مساوية لي:

> (mapcar #'(lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)
> (mapcar (lambda (x) (+ x 1)) '(1 2 3))
(2 3 4)

أي شخص يهتم تنوير المبتدئين عن الفرق؟

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

المحلول

#' هو اختصار ل function, ، والتي ترجع مؤشر إلى وظيفة (بدلا من تطبيقه). lambda إرجاع وظيفة، ومن المعتاد أن نريد مؤشر لهذه الوظيفة. نظرا لأن هذا شائع جدا، فهناك أيضا ماكرو (بمساحة متغيرة) يفعل ذلك من أجلك، والذي يسمى lambda كذلك. كلا سطر التعليمات متطابقة.

وهو أفضل يأتي إلى نقاش LISP-1 / LISP-2: في LISP المشترك، يمكنك القيام بذلك، بفضل ماكرو. كما هو الحال دائما، تكون متسقة.

نصائح أخرى

إنه مختلف في جداول LISP المختلفة. ما يلي يستخدم LISP المشترك:

أولا # 'هو تدوين قصير ل (وظيفة ...). وبعد وبالتالي فإن ما يلي فقط مختلف تماما، لكن LISP المشترك يقرأها بنفس الطريقة:

#'(lambda (x) (* x 2))

و

(function (lambda (x) (* x 2)))

# 'هي ReadMacro، وتحويلها عند قراءة رمز LISP بواسطة نظام LISP.

إذا كان LISP يقيم

(function (lambda (x) (* x 2)))

ال يقوم نظام LISP بإنشاء كائن وظيفة ووظيفة إرجاعها كقيمتها.

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

(map #'(lambda (x) (* x 2)) '(1 2 3))

(defun (y) #'(lambda (x) (* x y)))

(defparameter *twice-fn* #'(lambda (x) (* x 2)))

الآن، ما هو (Lambda (x) (* × 2))؟

إنه أمران مختلفان اعتمادا على السياق.

التعبير لامدا

يمكن استخدام تعبير Lambda بدلا من اسم الوظيفة:

(function foo)   and    (function (lambda (x) (* x 2)))

و

(foo 17)    and  ((lambda (x) (* x 2)) 17)

فوق اثنين هي بناء جملة LISP المشتركة القانونية. هناك تعبير لامدا يمكن استخدامه مباشرة.

لاحظ أن النموذجين التاليين غير شرعي في LISP المشترك:

(#'(lambda (x) (* x 2)) 17)   ; illegal in Common Lisp

(function #'(lambda (x) (* x 2)))  ; illegal in Common Lisp

دقيق

خلال عملية توحيد LISP المشتركة، تمت إضافة Lambda الماكرو (لم يكن جزءا من الوصف الأول، CLTL1، من LISP المشترك). يجعل من الممكن كتابة رمز أقصر قليلا. مثال:

(lambda (x) (* x 2))

في الحالة أعلاه Lambda هو ماكرو. خلال توسيع الماكرو، سيتم توسيعها إلى:

(function (lambda (x) (* x 2)))

تذكر أنه في نموذج الوظيفة أعلاه، فإن Lambda الداخلي جزء من تعبير Lambda، يدل على الوظيفة ولن يتم توسيعها.

لذلك، الآن يمكن كتابة الأمثلة الثلاثة من أعلاه على النحو التالي:

(map (lambda (x) (* x 2)) '(1 2 3))

(defun (y) (lambda (x) (* x y)))

(defparameter *twice-fn* (lambda (x) (* x 2)))

إنه أقصر قليلا، يبدو أقل قليلا فوضوح ويبدو أكثر مما يشبه رمز المخطط. يبدو مجرد أفضل قليلا للمبرمجين المستخدمة لقراءة وكتابة رمز المخطط.

ملخص

أ) (وظيفة (Lambda (x) (* × 2))) هي الطريقة "الحقيقية" لكتابة التعليمات البرمجية التي ترجع وظيفة كقيمة.

ب) # (Lambda (x) (* × 2)) هو تدوين أقصر أعلاه

ج) (Lambda (x) (* × 2)) أقصر، ولكنه يستخدم توسيع ماكرو لإنشاء شكل أ).

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