اجرای هدف گرا
دوشنبه 29 آذر 1389 7:38 AM
یکی از مفاهیم کلیدی Icon این است که ساختارهای کنترلی، بجای boolean منطقی در بسیاری از دیگر زبانهای برنامه نویسی، بر اساس عبارات "success" یا "failure" پایه گذاری شدهاند. در این الگو، مقایسههای ساده مانند if a<b مانند دیگر زبانها، به معنی « اگر عمل سمت راست درست ارزیابی شود » نیست، در عوض چیزی مثل « اگر عملیات سمت راست موفقیت آمیز باشند » معنی میدهد. در این حالت عملگر < موفقیت آمیز است اگر مقایسه درست باشد، بنابراین نتیجه نهایی نیز همین است. علاوه براین، عملگر < اگر موفقیت آمیز باشد، متغیر دومی را برمی گرداند، که اجازه میدهد چیزهایی شبیه if a<b<c، که یک شکل مقایسه رایج است و در اکثر زبانها بطور مستقیم قابل استفاده نیست، نوشته شوند.
کاربرد این مفهوم در ارتباط با مثالهای دنیای واقعی واضح تر شود. بنابراین Icon از موفقیت یا شکست برای همه جریانهای کنترلی استفاده میکند، مانند این نمونه کد:
if a := read() then write(a)
این کد یک خط از ورودی استاندارد را در خروجی استاندارد کپی خواهد کرد. چیزی که در مورد مثال مورد توجهاست این است که حتی اگر read() ایجاد خطا کند، کد کار خواهد کرد، مثلا اگر فایل موجود نباشد. در این حالت وضعیت a:=read() موفقیت آمیز نخواهد بود و به سادگی، write فراخوانی نخواهد شود. موفقیت و شکست در توابع به سمت بالا منتقل میشوند به این معنی که شکست در یک تابع تو در تو باعث میشود توابعی که آن را فراخوانی میکنند نیز با شکست روبرو شوند. برای نمونه، ما میتوانیم در یک خط، برنامهای بنویسیم که همه یک فایل ورودی را خروجی کپی کند :
while write(read())
هنگامی که دستور read() شکست میخورد، برای مثال در انتهای فایل، شکست بطور زنجیرهای بالا خواهد آمد و write() نیز به همین ترتیب شکست میخورد. while که یک ساختار کنترلی است، با شکست متوقف میشود، به این معنی که فایل خالی میباشد. برای مقایسه، مثالی مشابه این را در pseudocode براساس Java میبینیم :
try { while ((a = read()) != EOF) { write(a); } } catch (Exception e) { // do nothing, exit the loop }
در این حالت دو مقایسه نیاز است، یکی برای انتهای فایل (EOF) و دیگری برای تمام دیگر خطاها. چون Java اجازه نمیدهد خطاها مانند عبارات منطقی مقایسه شوند، مانند Icon، باید نحو طولانی try/catch بجای آن استفاده شود. همچنین بلوکهای try در عمل یک هزینه اضافی را، حتی اگر خطایی رخ ندهد، تحمیل میکنند، یک هزینه توزیعی که Icon از آن اجتناب میکند. بنابر این مفهوم، اجرای هدف گرا در Icon به این معناست که تا زمانی که برخی اهداف محقق شوند، اجرا ادامه مییابد. در مثال بالا هدف خواندن تمام فایل است. دستور خواندن تا زمانی ادامه مییابد که اطلاعاتی برای خواندن موجود باشد، و وقتی اطلاعاتی نباشد، شکست میخورد. بنابراین در این زبان، بجای استفاده از بررسی وضعیت بازگشتها یا ساختارهای مشابه، هدف مستقیما در کد آورده میشود.