ساختارهای دیگر
رشتههای 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 آمدهاست.
این کد از جای 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))