Code Corona
آموزش Scheme - بخش چهارم - نسخه‌ی قابل چاپ

+- Code Corona (http://forum.codecorona.com)
+-- انجمن: Private Forum (http://forum.codecorona.com/forumdisplay.php?fid=24)
+--- انجمن: Portal Forum (http://forum.codecorona.com/forumdisplay.php?fid=25)
+--- موضوع: آموزش Scheme - بخش چهارم (/showthread.php?tid=161)



آموزش Scheme - بخش چهارم - melomane - 17-04-2007

شرط ها*
مانند همه ی زبان های برنامه نویسی، اسکیم هم عبارات شرطی دارد. اساسی ترین فرم شرط if است. ساختار یک عبارت شرطی با if به صورت زیر است:
(if test-expression
then-branch
else-branch)
اگر test-expression به true ارزیابی شود (هر مقداری که #f نباشد) then-branch ارزیابی می شود. در غیر این صورت else-branch ارزیابی می شود. قسمت else اختیایر است.
(define p 80)

(if (> p 70)
'safe
'unsafe)
=> safe

(if (< p 90)
'low-pressure) ;no ``else'' branch
=> low-pressure
*برای بهینه سازی اسکیم عبارات دیگری برای شرط دارد که می توانند به صورت ماکرو تعریف شوند.
when و unless:
برای مواقعی که فقط یکی از بخش های شرط (بخش then یا else) از شرط پایه لازم است است، unless و when عبارات شرطی ببهینه تری هستند.
(when (< (pressure tube) 60)
(open-valve tube)
(attach floor-pump tube)
(depress floor-pump 5)
(detach floor-pump tube)
(close-valve tube))
بازنویسی این برنامه با if به این صورت خواهد بود:
(if (< (pressure tube) 60)
(begin
(open-valve tube)
(attach floor-pump tube)
(depress floor-pump 5)
(detach floor-pump tube)
(close-valve tube)))
توجه داشته باشید که when در خود begin را به طور غیر صریح دارد در حالی که اگر هر یک از بخش های شرط بیشتر از یک فرم باشند، If نیازمند begin است.
این برنامه با unless به صورت زیر است:
(unless (>= (pressure tube) 60)
(open-valve tube)
(attach floor-pump tube)
(depress floor-pump 5)
(detach floor-pump tube)
(close-valve tube))
(همه ی مفسرهای اسکیم دو فرم while و unless را ندارند. در این صورت می توانید آن ها را به صورت ماکرو تعریف کنید)


RE: آموزش Scheme - بخش چهارم - melomane - 17-04-2007

cond:
فرم cond برای پیاده سازی عبارات شرطی تو در تو مناسب تر است، جایی که هر else به جز آخری یک if دیگر دارد. بنابراین
if (char<? c #\c) -1
(if (char=? c #\c) 0
1))
را می توان به صورت زیر با cond بازنویسی کرد:
(cond ((char<? c #\c) -1)
((char=? c #\c) 0)
(else 1))
cond یک فرم شرطی چند بخشی است. هر عبارت، یک شرط و یک عمل مرتبط دارد. اولین شرطی که درست باشد عمل مرتبط با آن را انجام می دهد. عبارت آخرین else هنگامی اجرا می شود که تمامی شرط ها false باشند.
بخش هر عمل در خود به طور غیر صریح begin دارد.
case:
حالت خاصی از cond را می توان در case فشرده کرد. این وقتی است که هر شرط یک تست برابری است:
(case c
((#\a) 1)
((#\b) 2)
((#\c) 3)
(else 4))
=> 3
عبارتی که راس آن مقدار c را داشته باشد انتخاب می شود.
and و or
اسکیم دو فرم خاص برای عطف بولی (and) و فصل بولی (or) دارد. (در بخش 2 نیز منفی ساز عبارات بولی ،not، را دیدیم که یک روال بود.)
فرم and مقدار true برمی گرداند اگر همه ی زیر فرم هایش true باشند. مقدار واقعی برگشت داد شده مقدار آخرین زیر فرم است. اگر یکی از زیر فرم ها false باشد مقدار بازگشتی #f خواهد بود.
(and 1 2) => 2
(and #f 1) => #f

فرم or مقدار اولین زیر فرم true خود را برمی گرداند. اگر همه ی زیر فرم ها false باشند، or مقدار #f را بر می گرداند.
(or 1 2) => 1
(or #f 1) => 1
هر دو فرم or و and زیر فرم هایشان را از چپ به راست ارزیابی می کنند. با یافتن اولین زیر فرمی که مقدار بازگشتی قابل تشخیص باشد بقیه ی زیر فرم ها نادیده گرفته می شوند.
(and 1 #f expression-guaranteed-to-cause-error)
=> #f

(or 1 #f expression-guaranteed-to-cause-error)
=> 1