تابع cons
تابع cons
(با تلفظ /ˈkɒnz/ یا /ˈkɒns/) در برنامهنویسی رایانهای، یک تابع بنیادین در بیشتر گویشهای زبان برنامهنویسی لیسپ است. لغت cons
از واژه construct گرفته شدهاست و اشیای حافظهای را میسازد که «دو» "مقدار" یا "اشارهگر به مقدار" را نگهداری میکند. به این اشیاء، سلول cons یا conses یا عبارت-s غیراتمی ("NATSes") یا زوج cons گفته میشود. در اصطلاحات فنی لیسپ، عبارت "to cons x onto y" به معنی ساخت یک شیء جدید با دستور (cons x y)
است. جفت به دست آمده یکنیمه سمت چپ دارد که به آن car
گفته میشود (عنصر اول، یا محتوای قسمت آدرس ثبات) و نیز یک نیمه سمت راست دارد (عنصر دوم، یا محتوای قسمت کاهشی ثبات) که به آن cdr
گفته میشود.
این مفهوم به صورت سست به مفهوم شیءگرای سازنده مرتبط است، که در آن یک شیء جدید را پس از فرستادن آرگومانها میسازد، و به صورت نزدیکتر با تابع سازنده یک سامانه نوع داده جبری مرتبط است.
واژه "cons" و عباراتی مثل "to cons onto" به صورت عام، بخشی از اصطلاحات فنی برنامهنویسی تابعی است. بعضی اوقات عملگرهایی که هدف مشابهی دارند، مخصوصاً در زمینه «پردازش لیست» هم "cons" خوانده میشوند. (یک مثال خوب در این زمینه عملگر «::» است که در ML، Scala، F#، و Elm وجود دارد یا عملگر«:» در Haskell است که یک عنصر را به ابتدای یک لیست اضافه میکند).
استفاده
اگرچه سلولهای cons برای نگهداری زوجهای مرتب داده استفاده میشوند، اما معمولاً از آنها برای ساخت ساختمان دادههای مرکب پیچیده استفاده میشود، به ویژه برای فهرست و درخت دودویی.
جفتهای مرتب
برای مثال، عبارت لیسپ (cons 1 2)
یک سلول جدید را میسازد، که عدد ۱ را در نیمه سمت چپ نگهداری میکند (به اصطلاح میدان car
) و عدد ۲ را در نیمه سمت راست (میدان cdr
) نگهداری میکند. در نمادسازی لیسپ، مقدار (cons 1 2)
به این صورت است:
(1. 2)
به نقطه بین ۱ و ۲ توجه کنید؛ این نقطه نشاندهنده آن است که عبارت-S یک «جفت نقطهدار» (به اصطلاح "cons pair")، و نه یک "لیست" است.
لیستها
در لیسپ، لیستها روی زوجهای cons پیادهسازی میشوند. به صورت بخصوص، هر ساختار فهرست در لیسپ،
- یا لیست خالی
()
است، که یک شیء خاص است که معمولاً به آنnil
گفته میشود. - یا یک سلول cons است که در آن
car
اولین عنصر لیست است، وcdr
خودش یک لیست است که شامل مابقی عناصر است.
درختها
درختهای دودویی که داده را فقط در برگهایش نگهداری میکند نیز توسط cons
ساخته میشوند. برای مثال کد:
(cons (cons 1 2) (cons 3 4))
منجر به درخت زیر میشود:
((1. 2). (3. 4))
یا به عبارت دیگر:
* \ / * * \ / \ / 1 2 3 4
پیادهسازی تابعی
به دلیل آنکه لیسپ توابع کلاس-اول دارد، همه ساختمان دادهها (که شامل سلولهای cons است)، قابل پیادهسازی توسط توابع هستند. برای مثال در اسکیم:
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
(define (cdr z)
(z (lambda (p q) q)))
این فن کدگذاری چرچ نام دارد.
پانویس
منابع
مشارکتکنندگان ویکیپدیا. «cons». در دانشنامهٔ ویکیپدیای انگلیسی، بازبینیشده در ۱ اردیبهشت ۱۴۰۰.