وارونه کردن رشتهها (خواندن یک «رشته» از راست به چپ، نه از چپ به راست) کاری بهطور شگفتآوری رایج در برنامهنویسی است.
برای مثال، در بیوانفورماتیک، وارونه کردن ترتیب رشتههای DNA یا RNA اغلب برای تحلیلهای گوناگون اهمیت دارد؛ مثلاً برای یافتن رشتههای مکمل یا شناسایی توالیهای پالیندرومی که اهمیت زیستی دارند.
وظیفهی شما این است که یک رشتهی دادهشده را وارونه کنید.
چند مثال:
"stressed" را به "desserts" تبدیل کنید."strops" را به "sports" تبدیل کنید."racecar" را به "racecar" تبدیل کنید.هرچند برای رشتهها متدهای #reversed و #reverseDo: وجود دارد، آیا میتوانید خودتان بفهمید چطور این کار را با پیمایش کاراکترها در سطح پایینتر و جریانها انجام دهید؟
برای اینکه در مرور کد راحتتر باشید، Pharo ابزار جالبی برای پیدا کردن کد دارد. برای فعالکردن آن Shift-Enter را فشار دهید.
نکته: ما قرارداد Exercism را رعایت کردهایم و نام راهحل را ReverseString گذاشتهایم، اما نامی که بیشتر به Smalltalk میخورد StringReverser است.
در مورد رشتهها، چند جزئیات کوچک و بدیهی وجود دارد که ممکن است در اولین خواندن گیجتان کند، چون این قراردادها با آنچه در زبانهای دیگر به کار میرود فرق دارد: گیومهی دوتایی برای کامنتها، گیومهی تک برای رشتهها و نحو ویژه برای کاراکترها (مثلاً $x برای کاراکتر «x»).
مفهوم نماد هم وجود دارد؛ نماد رشتهای است که در سراسر حافظه یکتاست؛ یعنی وقتی ساخته میشود (معمولاً در زمان کامپایل)، جستوجویی در حافظه انجام میشود تا مشخص شود نماد دیگری مثل آن وجود دارد یا نه، و فقط همان نمونهی اصلی استفاده میشود. دلیلش فقط صرفهجویی در حافظه نیست، بلکه سرعت چشمگیر در مقایسهی نمادها هم هست.
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
همچنین در برنامههای Smalltalk کاما خیلی کم به کار میرود، چون هیچ نقش نحوی ندارد.
به همین دلیل است که مثلاً لیترالهای آرایه بدون کاما هستند؛ مثلاً
#(1 2 3 4 5)
اما کاما خودش یک عملگر است و هنگام الحاق دو رشته متوجه آن میشوید؛ مثلاً
'string1', 'string2'
در پایان، خوب است بدانید که رشتهها و کاراکترها دو کلاس مجزا هستند. یک رشته مجموعهای از کاراکترهاست. این موضوع هنگام پیمایش رشتهها میتواند غافلگیرتان کند، چون ممکن است کاراکترهایی را به متدی بدهید که انتظار رشته دارد. به این مثال توجه کنید...
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
جریانها برای خواندن و نوشتن ترتیبی مفیدند. آنها کد را تمیزتر میکنند، چون نیازی به افزایش یک اندیس نیست. جریانها روی هر مجموعهای کار میکنند.
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect
در Exercism ثبتنام کنید تا Pharo را همراه با 50 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.
۱۴ روش متفاوت برای معکوسکردن یک رشته را بررسی کنید و در این مسیر به موضوعات گوناگونی از جمله کدپوینتهای یونیکد، گرافمها، تخصیص حافظه در پشته در برابر هیپ و اشارهگرها میپردازید. راحت باشید و از ۴۵ دقیقه یادگیری همراه با Jeremy و Erik لذت ببرید.