تعریف توابع جدید در Lisp

چکیده :

تعریف توابع جدید در Lisp



برنامه‌نوسی در Lisp با تعریف توابع جدید انجام می‌شود. در اصل این به این معنی است كه: مشخص كردن لیستها در یك روش نحوی معین. مشابه تابع setq كه بوسیله مفسر Lisp در یك روش خاص رفتار می‌كرد. تابع خاص defun است كه برای ایجاد اشیای تابع جدید توسط مفسر Lisp بكار می‌رود. defunیك نماد دال برنام تابع، یك لیست از پارامترها(ممكن است خالی باشد) برای تابع جدید و تعداد دلخواهی از عبارات نمادینی كه بدنه تابع جدیدرا تعریف می‌كند را به عنوان آرگومانهایش می‌پذیرد. این تعویض از یك تابع ساده به نام my-sum است كه دو آرگومان می‌پذیرد و با استفاده از تابع پیش‌ساخته آنها را جمع می‌كند.
(defun my-sum (x y)

(+ x y))
این عبارت به همان روشی كه بعنوان یك تابع فراخوانی می‌شود در سیستم Lisp وارد می‌شود. ارزیابی یك تعریف تابع نام تابع را بعنوان مقدار برمی‌گرداند، اما یك شئ تابع را بعنوان اثر جانبی ایجاد خواهد كرد و وقتی Lisp شروع به اجرا می‌‌كند آن را به مجموعه تعاریف توابع شناخته شده توسط سیستم Lisp اضافه می‌كند (حداقل مجموعه توابع پیش‌ساخته)
توضیح اینكه در این مثال بدنه شامل تنها یك عبارت نمادین است. هر چند بدنه می‌تواند شامل ترتیب دلخواهی از عبارات نمادین باشد مقدار آخرین عبارت نمادین از بدنه مقدار تابع را تعیین می‌كند. به این معنی است كه در واقع همه عناصر بدنه بی تاثیر هستند مگر اینكه اثرات جانبی تصمیم‌گیری تولید كنند.
لسیت پارامتر تابع جدیدmy-sum به ما می‌گوید وقتی فراخوانی می‌شود درست دو عبارت نمادین را بعنوان آرگومان می‌پذیرد. بنابراین اگر شما(my-sum 3 5) را در سیستمLisp وارد كنید مفسرLisp قادر خواهد بود كه تعریف برای نام تابع مشخص شده بیابد و سپس آرگومانهای داده شده را از چپ به راست پردازش كند وقتی این كار انجام شد آن مقدار هر آرگومان را مطابق پارامتر مشخص شده در لیست پارامتر تعریف تابع وصل خواهد كرد(تخصیص خواهد داد) در مثال ما بدین معنی است كه مقدار آرگومان اول كه3 است(3 همان عدد3 است كه خودش را ارزیابی كرده است) به پارامترx متصل می‌كند. سپس مقدار آرگومان دوم كه 5 است به پارامترy متصل می‌شود. چون مقدار یك آرگومان به یك پارامتر متصل می‌شود، این روش فراخوانی با مقدار نامیده شده است. بعد از مقدار‌یابی برای همه پارامترها مفسرLisp قادر به ارزیابی بدنه تابع خواهد بود. مثال بدین معنی است كه ( 3 5 +) فراخوانی خواهد شد. نتیجه فراخوانی8 است كه بعنوان نتیجه فراخوانی(my-sum 3 5) برگردانده می‌شود. بعد از تكمیل فرا‌خوانی تابع اتصالات موقت پارامترهایx وy حذف می‌شوند. هنگامی كه یك تعریف تابع جدید در سیستمLisp وارد می‌شودمی‌تواند به عنوان جزئی از تعریف تابع جدید به همان روش كه بعنوان تابع پیش ساخته استفاده شده است بكار برده شود بطوریكه در مثال زیر نشان داده شده است.
(defun double-sum (x y)

(+ (my-sum x y) (my-sum x y)))
كه با دوبار فراخوانیmy-sum جمع آرگومانهایش را دو برابر خواهد كرد این مثال دیگری از یك تعریف تابع است نشان دادن استفاده از عبارات نمادین چند‌گانه در بدنه تابع است.
(defun hello-world () (print ”Hello World!”) ’done)

این تعریف تابع پارامتری ندارد زیرا لیست پارامتر آن خالی است بنابراین وقتی(hello-world) فراخوانی می‌شود مفسرLisp بلافاصله (print ”Hello World!”) را ارزیابی و رشته
”Hello World!”را روی نمایشگر شما بعنوان یك اثر جانبی چاپ می‌كند سپس نماد’done را ارزیابی خواهد كرد وdone را به عنوان نتیجه فراخوانی تابع برمی‌گرداند.