مسیرها
/
Common Lisp
Common Lisp
/
تمرین‌ها
/
مطالعه‌ی کاراکتر
مطالعه‌ی کاراکتر

مطالعه‌ی کاراکتر

تمرین یادگیری

مقدمه

کاراکتر

زبان Common Lisp هم مانند سایر زبان‌های برنامه‌نویسی کاراکتر دارد. کاراکترها اشیائی هستند که یک واحد از یک متن (مثلاً یک رشته یا یک جریان متنی) را نشان می‌دهند.

می‌توان کاراکترها را به اعداد صحیح تبدیل کرد و برعکس. (اما آن‌ها عدد صحیح نیستند؛ یک نوع داده‌ی متمایز هستند.)

کاراکترها را به صورت #\ به همراه اسمشان نمایش می‌دهند. اسم کاراکترهای رایجی مثل «A» یا «b» یا «9» یا «!» دقیقاً همین است: بنابراین #\A، #\b، #\9 و #\!. بعضی کاراکترهای غیرگرافیکی مثل فاصله یا خط جدید اسم‌هایی مثل #\Space و #\Newline دارند.

استاندارد فقط ایجاب می‌کند که یک پیاده‌سازی ۹۶ کاراکتر داشته باشد (کاراکترهای الفبایی لاتین در دو حالت بزرگ و کوچک (A-Za-z)، ارقام (0-9)، فاصله (#\Space)، خط جدید (#\Newline) و نشانه‌گذاری (مثلاً !$"'(),_-./:;?+<=>#%&*@[\]{|}`^~)). اما بیشتر پیاده‌سازی‌ها بیش از این ارائه می‌دهند، از جمله پیاده‌سازی‌هایی که همه‌ی کاراکترهای یونیکد را فراهم می‌کنند.

مقایسه‌ی کاراکترها

می‌توان کاراکترها را با char= یا char-equal از نظر برابری مقایسه کرد (دومی به بزرگی و کوچکی حروف حساس نیست).

می‌توان کاراکترها را با توابعی مانند char<، char>، char<=، char>= و نسخه‌های غیرحساس به بزرگی و کوچکی آن‌ها، یعنی char-lessp و char-greaterp، مرتب کرد.

انواع کاراکتر

کاراکترها را می‌توان در انواع گوناگون دسته‌بندی کرد: گرافیکی، الفبایی، الفبایی‌عددی، رقمی، بزرگ یا کوچک. یک کاراکتر می‌تواند به بیش از یک نوع تعلق داشته باشد؛ مثلاً یک کاراکتر الفبایی بزرگ. برای هر یک از این انواع، محمولی وجود دارد: graphic-char-p، alpha-char-p، alphanumericp، digit-char-p، upper-case-p و lower-case-p.

تبدیل بزرگی و کوچکی کاراکتر

بعضی کاراکترها می‌توانند بزرگ یا کوچک باشند و می‌توان با char-upcase و char-downcase آن‌ها را به هم تبدیل کرد.

دستورالعمل‌ها

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

1. مقایسه‌ی نویسه‌ها

لوییس به تابعی نیاز دارد که دو «نویسه» را با هم مقایسه کند و مشخص کند که نویسه‌ی اول از دومی بزرگ‌تر است، کوچک‌تر است یا با آن برابر است. تابعی به اسم compare-chars بنویسید که دو نویسه می‌گیرد و بسته به موقعیت به :greater-than، :less-than یا :equal-to ارزیابی می‌شود. این تابع باید مقایسه را به‌صورت حساس به بزرگی و کوچکی حروف انجام دهد.

2. تعیین «اندازه»ی نویسه

لوییس باید بداند که آیا یک نویسه «بزرگ» است (یک نویسه‌ی بزرگ) یا «کوچک» (یک نویسه‌ی کوچک)، و اگر هیچ‌کدام نبود «بدون اندازه». تابعی به اسم size-of-char بنویسید که بسته به «اندازه»ی نویسه به :big، :small یا :no-size ارزیابی می‌شود:

3. تغییر «اندازه»ی نویسه

ممکن است لوییس لازم داشته باشد یک نویسه‌ی بزرگ را کوچک کند، یا یک نویسه‌ی کوچک را بزرگ. تابعی به اسم change-size-of-char بنویسید که دو پارامتر می‌گیرد: یک نویسه و اندازه‌ی دلخواه (:big یا :small). این تابع باید به نویسه‌ی متناظر با اندازه‌ی درست ارزیابی شود.

4. تعیین «نوع» نویسه

لوییس نه تنها باید بداند «اندازه»ی نویسه چیست، بلکه باید «نوع» آن را هم بداند. تابعی به اسم type-of-char بنویسید که اگر نویسه الفبایی باشد به :alpha، اگر نویسه‌ی عددی باشد به :numeric، اگر نویسه‌ی فاصله باشد به :space، اگر نویسه‌ی سطر جدید باشد به :newline و در غیر این صورت به :unknown ارزیابی می‌شود

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Common Lisp Exercism

آماده‌اید مطالعه‌ی کاراکتر را شروع کنید؟

در Exercism ثبت‌نام کنید تا Common Lisp را همراه با 27 مفهوم92 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.