0

زبان برنامه‌نویسی کوبول

 
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

دستورالعمل‌های پردازش لیست

دستورالعمل‌های پردازش لیست

لیسپ دستورالعمل‌های زیادی را برای دستیابی و کنترل لیست‌ها فراهم می‌کند . لیست‌ها می‌توانند مستقیما با پردازهٔ لیست ایجاد شوند .لیست هر تعدادی از آرگومان‌ها را می‌پذیرد و تعدادی از آرگومان‌ها را بر می‌گرداند.

(list 1 2 ‘a 3 );
Output : (1 2 a 3 )
(list 1(2 3) 4 );
Output : (1 (2 3) 4)

به این دلیل راهی که لیست‌ها ایجادمی شوند از جفت‌های Cons (Car,Cdr) پردازهٔ Cons می‌تواند برای اضافه کردن یک عنصر به جلوی یک لیست استفاده شود. توجه کنید که پردازهٔ Cons در هدایت و به کار بردن آرگومان‌های لیست نامتقارن است ، بدین دلیل روش‌های لیست‌ها ایجاد می‌شوند.

(Cons 1(2 3));
Output: (1 2 3 )
(Cons(1 2)(3 4))
Output : ((1 2) 3 4)

پردازهٔ Oppend دو یا چند لیست را با هم ادغام می‌کند و یک لیست واحد ایجاد می‌کند زیرا لیست لیسپ یک لینک لیست است و پیچیدگی زمانی الحاق کردن لیست‌ها از مرتبهٔ پیچیدگی زمانی O(n) می‌باشد. ساختار اشتراکی: لیست‌های لیسپ لینک لیست‌های ساده می‌توانند با یکی دیگر از لیست‌ها در ساختمان مشترک باشند به عبارت دیگر دو لیست می‌توانند دم یکسانی داشته باشندیا رشتهٔ پایانی از Cons‌های یکسانی داشته باشند مثلا:

(setf foo (list 'a 'b 'c))
(setf bar (cons 'x (cdr foo)))

لیست foo و bar به ترتیب به صورت (a b c) و (X b c ) هستند هرچند دم (b c ) در هر دو لیست ساختار یکسانی دارند ولی مانند هم نیستند، خانه‌های Cons اشاره گر به b و c در محل حافظهٔ یکسانی برای هردو لیست قرار دارد. ساختار اشتراکی سریع تر از کپی کردن می‌تواند به صورت چشمگیری کارایی را بهبود بخشند. هرچند ، این مهارت می‌تواند متقابلا در راه‌های نامطلوب با عملکردهایی که تغییرات لیست‌های گذشته روی آرگومان‌های آن تاثیر بگذارد ، اثر کند. تغییرات یک لیست از قبیل تغییر دادن C با یک goose روی دیگری نیز تاثیر می‌گذارد

setf (third foo) 'goose)

که این تغییر نتیجه را به صورت (a b goose) تغییر می‌دهد اما bar هم تغییر می‌کند (X b goose) که ممکن است یک نتیجهٔ غیر منتظره باشد. زبان‌های برنامه نویسی Lisp معمولاً از یک خط دستور محاوره‌ای استفاده می‌کنند،که می‌تواند با یک محیط پیچیدهٔ گسترش یافته ترکیب شود.کاربر اصطلاحات و دستورات را در خط دستور وارد کرده یا با رهبری IDE آنها را به سیستم Lisp می‌فرستد. Lisp دستورات را می‌خواند ، آن‌ها را ارزیابی می‌کند و نتایج را چاپ می‌کند. به این دلیل است که خط دستور زبان Lisp به حلقهٔ Read-Eval-Print یا REPL معروف است. نمونهٔ ساده‌ای از عملیات REPL در زیر آمده‌است. این یک شرح ساده‌است که بسیاری از المان‌های Lispواقعی در آن نمی‌آید مانند ماکروها و کوئت‌ها. تابع read جملات متنی را به عنوان ورودی می‌پذیرد و آنها را به ساختار لیست تجزیه می‌کند. به عنوان مثال ، وقتی شما رشتهٔ (+ 1 2) را در اعلان تایپ می‌کنید، تابع read آن را به یک لیست پیوندی حاصل از 3 المان ترجمه می‌کند: علامت + ، عدد 1 و عدد 2 . خیلی اتفاق می‌افتد که لیست قسمت موثری از یک کد Lisp باشد که قابل ارزیابی است.به همین دلیل است که یک قطار از لیست به یک تابع نام عملگر مع می‌دهد. تابع eval ساختار لیست را ارزیابی می‌کند و نوعی دیگر از ساختار را به عنوان نتیجه باز می‌گرداند.ارزیابی کردن لزوما تفسیر کردن معنی نمی‌دهد؛ بعضی سیستم‌های Lisp هر عبارتی را به زبان ماشین تبدیل می‌کنند. خیلی ساده است؛ به هر حال؛ برای تعریف ارزیابی به عنوان تفسیر : برای ارزیابی یک لیست که نام تابع دارد ، eval ابتدا تمام آرگومان‌های داده شده به cdr اش را ارزیابی می‌کند و سپس تابع را روی آن آرگومان‌ها اعمال می‌کند.در این مثال ، تابع عمل جمع است و به آرگومان‌های (1 2) اعمال می‌شود که نتیجه 3 است.این نتیجهٔ ارزیابی است. این وظیفهٔ تابع print است که نتیجه را به کاربر نمایش دهد. برای نتیجهٔ سادهٔ 3 این کار ناقابل است. یک عبارت که با قسمتی از ساختار لیست ارزیابی می‌شود میاز دارد که print لیست را به حرکت در آورد و در خروجی به شکل یک عبارت S نمایش دهد. برای اجرا کردن یک REPL در Lisp ، تنها لازم است که این سه تابع را اجرا کنید و یک تابع حلقه بی نهایت را.(به طور طبیعی اجرای eval پس از اجرای عملگرهای ویژه‌ای مانند if پیچیده خواهد شد.)یک REPL ساده به خودی خود با یک خط کد انجام شد: (loop(print(eval(red))))

لیست در اصل تعداد کمی ساختار کنترلی دارد. منتها در تکامل و گسترش زبان تعداد زیادی به آن اضافه شدند.(عملگر اصلی شرایط در زبان Lisp که cond بود بعداً متشکل شد از ساختار if-then-else)

برنامه نویسان در نسخهٔ Scheme حلقه‌ها را به صورت بازگشت دم( tail recursion ) بیان می‌کنند. موسسات متعارف علوم کامپیوتر Scheme بعضی دانشجویان را متعاقد می‌کند که تنها راه تکرار در زبان Lisp استفاده از بازگشت دم است؛ این اشتباه است. تمامی نسخه‌های متداول دیده شده از Lisp دارای ساختارهای الزامی برای تکرار هستند.درScheme دستور do به عنوان دستور حلقه پیچیدهٔ Lisp است. علاوه بر این مسالهٔ اصلی که شی گرایی را مهمتر از مسالهٔ فاعلی کرده این است که Scheme نیازهای ویژه‌ای برای کارکردن با فراخوانی دم(tail calls )دارد، در نتیجه دلیل ترغیب Scheme به استفاده از بازگشت دم این است که روش صراحتا با تعریف خود زبان پشتیبانی می‌شود . در مقابل ، ANSI Common Lisp نیازی به بهینه سازی که معمولاً به حذف فراخوانی دم گفته می‌شود ندارد. در نتیجه این حقیقت که بازگشت دم به عنوان یک جایگزین تصادفی برای استفاده از ساختارهای مبتنی بر تکرار ( مانند do dolist loop ) توصیه نمی‌شود تنها یک مسالهٔ برتری ادبی نیست ، ولی بالقوه یکی از کارآمدهاست ( بعد از این که این روش فقط به عنوان یک پرش ساده به کار نرفت) و به عنوان یک تصحیح برنامه است. بعضی از ساختارهای کنترلی Lisp عملگرهای ویژه‌ای هستند ، هم ارز کلیدواژه‌های ترکیبی باقی زبان‌ها. عباراتی که این عملگرها استفاده می‌کنند ظاهری شبیه فراخوانی تابع دارد، تفاوت اینجاست که آرگومان‌ها ضرورتا نباید ارزیابی شوند یا در مورد تکرار شاید بارها ارزیابی شوند. در مقابل اکثر زبان‌های برنامه نویسی ، Lisp به برنامه نویسان اجازه می‌دهد با خود زبان ساختاهای کنترلی را پیاده سازی کنند.ساختارهای کنترلی زیادی در ماکروهای Lisp پیاده سازی می‌شوند و برنامه نویسان می‌توانند هر ماکرو را گسترش دهند ،برای آنانی که می‌خواهند بدانند چطور کار می‌کند. هر دوی Lisp Common و Scheme دارای عملگرهای کنترلی غیر محلی هستند.تفاوت این عملگرها یکی از عمیق‌ترین تفاوت‌ها مابین این دو نسخهٔ زبان است. Scheme از ورودی مستمر با استفاده از روش call/cc پشتیبانی می‌کند ، که به برنامه اجازهٔ ذخیره ( و بعداً بازیابی کردن) یک عملیات ویژه را می‌دهد . Common Lisp از ورودی مستمر پشتیبانی نمی‌کند ولی از راه‌های زیادی برای انجام رهایی از تکرار پشتیبانی می‌کند.

دوشنبه 29 آذر 1389  7:34 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

آیکون

آیکون (Icon)، یک زبان برنامه نویسی بسیار سطح بالا است که برای آسان نمودن نوشتن برنامه‌هایی با هدف کار با رشته‌ها و ساختارها، طراحی شده‌است. این زبان هم مانند بسیاری از زبان‌ها از زبان دیگری مشتق شده‌است. زبان اصلی - که این زبان از روی آن طراحی شده‌است - SNOBOL است. SNOBOL در آزمایشگاه Bell Telephone در اوایل دهه 60 ساخته شد. بعد به زبان SNOBOL4 ارتقا یافت. که هم اکنون نیز از آن استفاده می‌شود. Icon در ظاهر ساختارش از SNOBOL4 تاثیر برداشته‌است. Icon یک زبان بسیار سطح بالا با ویژگی اجرای هدف گرا بوده و امکانات زیادی برای پردازش رشته‌ها و الگوهای متنی دارد. این زبان با SNOBOL که یک زبان پردازش رشته‌است مرتبط است. Icon شی گرا نیست، اما یک نمونه شی گرا که Idol نامیده می‌شد در سال 1996 گسترش یافت که سرانجام تبدیل به Unicon شد.

دوشنبه 29 آذر 1389  7:35 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

درباره آیکون

درباره آیکون

طراحی و پیاده سازی این زبان در محیطی آکادمیک و نه اقتصادی انجام شده‌است. این زبان توسط هیئت علمی، کارمندان و دانشجویان دانشگاه آریزونا، با کمک‌های مالی داوطلبانه از سراسر دنیا پیاده سازی شد.

Icon یک زبان برنامه‌نویسی همه منظوره، با قابلیت‌های گسترده برای پردازش رشته‌ها (متن) و ساختارهای داده‌است. این زبان در دسته بندی زبان‌ها جز دسته زبان‌های امری طبقه‌بندی می‌شود. یک زبان با گرامری شبیه C و پاسکال. ولی با معنایی در سطح خیلی بالاتر، که با آن می‌توان کارهای پیچیده‌ای انجام داد.

Icon یک روش نو برای ارزیابی عبارات دارد سبب ارزیابی عبارت بر اساس هدف می‌شود. قابلیت چک کردن تطابق رشته‌ها را دارد که باعث دور شدن برنامه‌نویس از مشکلات ملال‌آور کار با رشته‌ها می‌شود. داده‌ساختارها درونی Icon شامل setها و جدول‌ها با قابلیت داشتن لیست‌هایی است که بتوان از آن به عنوان vector استفاده کرد. سیستم type این زبان قوی است. تبدیل تایپ در این زبان به صورت خودکار انجام می‌شود. و اگر یک عددی، در جایی که باید رشته به کار رود استفاده شود، به صورت خودکار به رشته تبدیل می‌شود. چند پیاده‌سازی از icon قابلیت‌های سطح بالای گرافیکی، با رابط آسان کاربری وجود دارد. Icon مدیریت حافظه خودکار دارد، اشیا زمانی که به آنها احتیاج هست، در طول اجرا ساخته می‌شوند. و فضا با garbage collection آزاد می‌گردد. تنها محدودیت در طول رشته‌ها و ساختارهای داده، میزان حافظه موجود است.

کلمه Icon مخفف و بیان‌گر موضوع خاصی نیست. با این وجود وقتی این اسم را انتخاب می‌کردند به کلمه iconoclatis –به معنای بت‌شکنی - نیز اشاره‌هایی شد. این اسم قبل از این که این کلمه کاربرد کنونی خود را پیدا کند انتخاب شد. ممکن است بعضی‌ها فکر کنند که این زبان برای طراحی icon(نقشک) ساخته شده، ولی این طور نیست.

دوشنبه 29 آذر 1389  7:35 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

Icon برای چه کارهایی خوب است؟

Icon برای چه کارهایی خوب است؟

یک زبان همه منظوره مثل Icon به درد اکثر کارهای برنامه‌نویسی می‌خورد. به خصوص برای ساخت ابزارهای نرم‌افزاری برای پردازش روی متن، و برای برنامه‌های تحقیقاتی و مطالعاتی مناسب است.این زبان برای راحت‌تر ساختن برنامه نویسی درست شده‌است، روی ارزش زمان برنامه‌نویس و اهمیت سریع به کار افتادن برنامه توجه می‌کند. به صورت متداول این زبان برای کارهای کوتاه، کارهایی که یک بار می‌توان آن‌ها را انجام داد و انجام آن (نه کیفیت انجام) مهم است و کارهای بیش از حد پیچیده‌است.

ویژگی‌های زبان Icon

  • زبان سطح بالا، همه منظوره
  • احتیاجی به ; در آخر خط‌ها ندارد.
  • توجه به بالا بردن بهره‌وری برنامه‌نویس
  • تابعی بودن
  • مقدارها type دارند. متغییرها ندارند. (هر مقداری را قبول می‌کنند)
  • حوزه ایستا (عمومی یا محلی) static scoping
  • همه اعداد دقت اختیاری دارند.
  • String نوع داده اولیه محسوب می‌شود.
  • Listهایی دارد که مثل آرایه، صف و یا پشته عمل می‌کنند.
  • شی‌گرا نیست.
  • همروندی ندارد.
  • کتابخانه بزرگی از توابع دارد.
دوشنبه 29 آذر 1389  7:37 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

اجرای هدف گرا

اجرای هدف گرا

یکی از مفاهیم کلیدی 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 به این معناست که تا زمانی که برخی اهداف محقق شوند، اجرا ادامه می‌یابد. در مثال بالا هدف خواندن تمام فایل است. دستور خواندن تا زمانی ادامه می‌یابد که اطلاعاتی برای خواندن موجود باشد، و وقتی اطلاعاتی نباشد، شکست می‌خورد. بنابراین در این زبان، بجای استفاده از بررسی وضعیت بازگشت‌ها یا ساختارهای مشابه، هدف مستقیما در کد آورده می‌شود.

دوشنبه 29 آذر 1389  7:38 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

نحو پایه

نحو پایه

زبان Icon از خانواده ALGOL زبانهای برنامه نویسی ساخت یافته‌است مشتق شده‌است و بنابراین نحوی شبیه به C یا Pascal دارد. Icon بیشتر شبیه به Pascal است، از نحو := برای تخصیص، کلمه کلیدی procedure و نحو مشابه آن استفاده می‌کند. از طرف دیگر Icon از سبک پرانتزهای C برای ساخت یافته سازی گروه‌های اجرایی استفاده می‌کند و اجرای برنامه‌ها با رویه‌ای به نام main آغاز می‌شود. از خیلی جهات Icon همچنین خصوصیاتی شبیه به بسیاری از زبان‌های برنامه نویسی اسکریپتی دارد (مانند SNOBOL): الزامی برای تعریف متغیرها نیست، انواع بطور اتوماتیک تعیین می‌شوند، و اعداد می‌توانند بطور اتوماتیک به رشته‌ها تبدیل شوند و برعکس. ویژگی دیگری که در زبان‌های اسکریپتی رایج است، اما نه در همه آنها، استفاده از کاراکتر پایان خط است، در Icon، خط‌ها با نقطه و ویرگول پایان نمی‌یابند و اگر منطقی باشد با نقطه و ویرگول ضمنی پایان می‌یابند. رویه‌ها بلوک‌های پایه برنامه‌های Icon هستند، و اگرچه آنها از نام گذاری Pascal استفاده می‌کنند اما بیشتر شبیه توابع C عمل می‌کنند و می‌توانند مقادیری را برگردانند، در Icon کلمه کلیدی function وجود ندارد.

 procedure doSomething(aString)
 write(aString)
 end
دوشنبه 29 آذر 1389  7:38 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

مولدها

مولدها

عبارات در Icon اغلب فقط یک مقدار برمی گردانند، برای نمونه، x<5 با موفقیتی با مقدار 5 یا شکست ارزیابی خواهد شد. مثال‌هایی از every و to. every سبب می‌شود تا to تا زمانی که شکست بخورد به برگرداندن مقادیر ادامه دهد. مولدها یکی از مفاهیم کلیدی در Icon هستند. مولدها بسیاری از ساختارهای حلقه‌ای را، بصورت بسیار صریح تر، در این زبان هدایت می‌کنند. برنامه نویس حلقه‌ای نمی‌نویسد و نیازی به مقایسه شرط نیست، Icon همه این کارها را برای او انجام می‌دهد. Icon شامل چندین مولدساز است. نحو alternator اجازه می‌دهد یک سری از آیتم‌ها، تا هنگامی که یکی شکست بخورد، به ترتیب تولید شوند: 1 | "hello" | x<5، اگر x از 5 کمتر باشد، می‌تواند "1"، "hello" و "5" را تولید کند. متناوب سازها می‌توانند در بسیاری از حالت‌ها مانند "or" خوانده شوند، برای نمونه :

 if y < (x | 5) then write(«y=», y)

اگر از x یا 5 کوچکتر باشد، این کد مقدار y را در خروجی خواهد نوشت. Icon بصورت ساختاری تمام مقادیر را از چپ به راست چک می‌کند تا اولین موفقیت رخ دهد یا لیست خالی شود و شکست را برگرداند. یادآوری می‌شود که توابع فقط تا زمانی که فراخوانی‌های شامل آنها شکست نخورد، فراخوانی خواهند شد، بنابراین این مثال را می‌توان بصورت کوتاه تر، به شکل زیر نوشت :

 write(«y=», (x | 5) > y)

یک مولد ساده دیگر to است که می‌تواند اعداد صحیح تولید کند، every write(1 to 10) دقیقا همانگونه که نشان می‌دهد عمل خواهد کرد. نحو bang هر آیتم یک لیست را تولید می‌کنند. every write(!aString) هر کاراکتر aString را در یک خط جدید خواهد نوشت. اثبات قدرت این مفهوم، مقایسه عملگرهای رشته‌است. اغلب زبانها تابعی با نام find یا indexOf دارند که موقعیت یک رشته را در رشته دیگر برمی گرداند. در مقایسه با :

 s = «All the world's a stage. And all the men and women merely players»;
i = indexOf("the", s)

این کد 4 را به عنوان اولین موقعیت ظاهر شدن کلمه "the" برخواهد گرداند. برای پیدا کردن نمونه بعدی "the" از تناوب استفاده می‌شود، , i = indexOf("the", s, 5)، 5 در انتها بیان می‌کند که باید از موقعیت 5 به بعد جستجو شود. برای یافتن تمام دفعات ظاهر شدن "the"، یک حلقه باید استفاده شود...

 s = «All the world's a stage. And all the men and women merely players»;
i = indexOf("the", s)
while i != -1 {
write(i);
i = indexOf("the", s, i+1);
}

در Icon تابع find یک مولد است، و نمونه بعدی از رشته را تا زمانی که در انتهای رشته شکست بخورد در هر دفعه بازخواهد گرداند. همان کد در Icon می‌تواند اینطور نوشته شود :

 s := «All the world's a stage. And all the men and women merely players»
every write(find("the",s))

Find، موقعیت نمونه بعدی "the" را هربار بازخواهد گرداند و تا زمانی که به انتهای رشته برسد ادامه می‌یابد. البته زمانهایی هست که شما می‌خواهید عمدا رشته‌ای را بعد از نقطه‌ای از ورودی بیابید، برای نمونه، شما ممکن است بخواهید یک فایل متنی را که شامل داده‌های یک جدول متقاطع است بررسی کنید. اجرای هدفگرا در اینجا بخوبی عمل خواهد کرد و به این صورت می‌تواند مورد استفاده قرار گیرد :

 write(5 < find("the", s))

اگر "the" بعد از موقعیت 5 ظاهر شود، موقعیت برگردانده خواهد شد، در غیر این صورت مقایسه شکست خواهد خورد و مانند قبل، شکست را به write() منتقل خواهد کرد. در این کد یک ترفند کوچک وجود دارد که نیاز به ملاحظه دارد : مقایسه مقدار سمت راست را برمی گرداند، بنابراین لازم است که find را در سمت راست مقایسه قرار دهیم. اگر 5 در سمت راست قرار گیرد، 5 نوشته خواهد شد. Icon چند ساختار کنترلی را برای حلقه مولدها اضافه می‌کند. عملگر every شبیه whileاست، ایجاد حلقه می‌کند و با رسیدن به شکست، حلقه پایان می‌یابد.

 every k := i to j do
 write(someFunction(k))

چرا every را بجای حلقه while در این حالت استفاده می‌کنیم؟ چون while مجددا نتیجه اولیه را مقداردهی می‌کند اما every همه نتایج را تولید می‌کند. نحو every مانند بلوک‌ها در Smalltalk مقادیر را به تابع می‌فرستد. برای نمونه، حلقه بالا می‌تواند بصورت زیر بازنویسی شود :

 every write(someFunction(i to j))

کاربران می‌توانند با استفاده از کلمه کلیدی suspend به آسانی مولدهای جدید ایجاد کنند :

 procedure findOnlyOdd(pattern, theString)
 every i := find(pattern, theString) do
 if i % 2 = 1 then suspend i
 end

این مثال روی theString که از find برای پیدا کردن الگو استفاده می‌کند دور می‌زند. وقتی نمونه‌ای پیدا شود، و موقعیت فرد باشد، موقعیت از تابع با suspend برگردانده می‌شود. در غیر این صورت return suspend در جایی که در مولدهای عمومی نوشته می‌شود.

دوشنبه 29 آذر 1389  7:40 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

رشته‌ها

رشته‌ها

Icon برای حذف عملکرد شبه اسکریپتی خود، قابلیت‌هایی را برای سهولت کار با رشته‌ها افزوده‌است که قابل توجه‌ترین آنها scanning system است که بطور مکرر در توابع رشته‌ای فراخوانی می‌شود :

 s ? write(find("the"))

این کد، حالت کوتاه تر مثال‌هایی است که قبلا نشان داده شد. در این حالت عنوان تابع find در خارج از پارامترها در جلوی علامت سئوال قرار داده می‌شود.

در زبان Icon چند ویژگی به آن اضافه شده‌است که کارکردن با رشته را آسان‌تر می‌کند. بیشترین چیزی که در این زبان جلب توجه می‌کند، سیستم بررسی رشته آن است که توابع را به صورت پیاپی روی رشته فراخوانی می‌کند.

s ? write(find("the"))

صورت ساده شده یکی از مثال‌های قبلی است. در این جا چیزی که در آن باید تابع find بگردد در بیرون تابع find و قیل از علامت سوال آمده‌است. زیر رشته‌ها از یک رشته با استفاده از براکت و مشخص کردن بازه به دست کی آیند. یک بازه می‌تواند به یک کاراکتر از رشته یا یک تکه از رشته اشاره کند. رشته‌ها می‌توانند از راست به چپ یا برعکس index شوند. مهم این است که شمارهٔ این اندیس‌ها می‌تواند 1A2B3C4 یا -3A-2B-1C0 باشد. برای مثال:

"Wikipedia"[1]     ==> "W"
"Wikipedia"[3]     ==> "k"
"Wikipedia"[0]     ==> "a"
"Wikipedia"[1:3]   ==> "Wi"
"Wikipedia"[-2:0]  ==> "ia"
"Wikipedia"[2+:3]  ==> "iki"

در آخرین مثال بجای بازه طول آن نشان داده شده‌است.

در این جا چند کار دیگر که با رشته‌ها می‌توان انجام داد را می‌بینید:

s := "abc"
s[2] := "123"

"a123c"مقدار کنونی s است.

s := "abcdefg"
s[3:5] := "ABCD"

"abABCDefg" مقدار کنونی s است.

s := "abcdefg"
s[3:5] := ""

"abefg" مقدار کنونی s است.

 

دوشنبه 29 آذر 1389  7:41 AM
تشکرات از این پست
golami1223
golami1223
کاربر برنزی
تاریخ عضویت : آبان 1389 
تعداد پست ها : 683
محل سکونت : بوشهر

ساختارهای دیگر

ساختارهای دیگر

رشته‌های Icon لیست‌های ساده‌ای از کاراکترها هستند، مانند معادل آنها در C. علاوه بر این، Icon به کاربر اجازه می‌دهد به آسانی لیست‌های خودش را ایجاد کند (یا آرایه‌ها) :

 aCat := ["muffins", "tabby", 2002, 8]

آیتم‌های موجود در یک لیست می‌توانند از هر نوعی باشند، از جمله ساختارهای دیگر. برای ساختن سریع تر لیست‌های بزرگتر، Icon شامل مولد list است، i := list(10, "word") یک لیست که شامل 10 کپی از "word" است را تولید می‌کند. مانند آرایه‌ها در زبانهای دیگر، Icon اجازه می‌دهد آیتم‌ها با موقعیت شان جستجو شوند. weight := aCat[4] Icon شامل توابع شبه پشته‌ای است، push و pop امکان ایجاد پشته‌ها و صف‌ها را فراهم می‌آورند. Icon همچنین شامل توابعی برای مجموعه‌ها و جدول هاست. (درهم سازی‌ها، آرایه‌های انجمنی، لغت نامه‌ها و...)

 symbols := table(0)
 symbols["there"] := 1
 symbols["here"] := 2

این کد جدولی که مقدار پیش فرض هر کلید ناشناخته آن صفر است ایجاد می‌کند. سپس دو آیتم را با کلیدهای "there" و "here" و مقادیر 1 و 2 به آن اضافه می‌کند.

 

نمونه برنامه‌های زبان Icon

procedure main()
while write(map(read(), &ucase, &lcase))
end

اولین خط برنامه را شروع می‌کند.read و write توابعی هستند که یک خط را می‌خوانند یا می‌نویسند. map یک رابطه یک به یک با توجه به آرگومان‌های 2و3 جا به جا می‌شود.دو کلمه کلیدی &ucase و &lcase شامل کاراکترها ی حروف بزرگ و کوچک است while هم یک حلقه‌است که تا زمانی که عمل خواندن تمام نشده تکرار می‌شود.

s = «All the world's a stage. And all the men and women merely players»;
i = indexOf("the", s)

این کد 4 را برمی گرداند. جای اولین باری که در آن the آمده‌است.

i = indexOf("the", s, 5)

این کد از جای 5 به بعد دنبال the می‌گردد.

s = «All the world's a stage. And all the men and women merely players»;
i = indexOf("the", s)
while i != -1 {
  write(i);
  i =  indexOf("the", s, i+1);
}

در هر مرحله جای بعدی رشته the را بر می‌گرداند تا زمانی که پس از تمام کردن رشته s ناموفق باشد که تمام می‌شود. همین کد تحت Icon می‌تواند به این صورت نیز نوشته شود:

s := «All the world's a stage. And all the men and women merely players»
every write(find("the",s))

findهر دفعه که فراخوانی شود، جای بعدی رشته the در s را می‌دهد.

write(5 < find("the", s))

زمانی رشته را برمی‌گرداند که جایی که در آن the پیدا شده شماره‌اش از 5 بیشتر باشد.

every k := i to j do
write(someFunction(k))

چرا از every جای while در این مورد استفاده شده؟ چون while نتیجه اول را دوباره ارزیابی می‌کند در حالی که every همه نتایج را تولید می‌کند. عبارت every در واقع مقدارهای قبلی را به تابع می‌دهد، به عنوان مثال کد بالا می‌تواند به این صورت بازنویسی شود.

every write(someFunction(i to j))

 

دوشنبه 29 آذر 1389  7:41 AM
تشکرات از این پست
دسترسی سریع به انجمن ها