تابع cons

تابع  (با تلفظ  یا ) در برنامه‌نویسی رایانه‌ای، یک تابع بنیادین در بیشتر گویش‌های زبان برنامه‌نویسی لیسپ است. لغت  از واژه construct گرفته شده‌است و اشیای حافظه‌ای را می‌سازد که «دو» "مقدار" یا "اشاره‌گر به مقدار" را نگهداری می‌کند. به این اشیاء، سلول cons یا conses یا عبارت-s غیراتمی ("NATSes") یا زوج cons گفته می‌شود. در اصطلاحات فنی لیسپ، عبارت "to cons x onto y" به معنی ساخت یک شیء جدید با دستور (cons x y) است. جفت به دست آمده یک‌نیمه سمت چپ دارد که به آن  گفته می‌شود (عنصر اول، یا محتوای قسمت آدرس ثبات) و نیز یک‌نیمه سمت راست دارد (عنصر دوم، یا محتوای قسمت کاهشی ثبات) که به آن گفته می‌شود.

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

واژه "cons" و عباراتی مثل "to cons onto" به صورت عام، بخشی از اصطلاحات فنی برنامه‌نویسی تابعی است. بعضی اوقات عملگرهایی که هدف مشابهی دارند، مخصوصاً در زمینه «پردازش لیست» هم "cons" خوانده می‌شوند. (یک مثال خوب در این زمینه عملگر «::» است که در ML، Scala, F#، و Elm وجود دارد یا عملگر «:» در Haskell است که یک عنصر را به ابتدای یک لیست اضافه می‌کند).

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

جفت‌های مرتب 
برای مثال، عبارت لیسپ  یک سلول جدید را می‌سازد، که عدد ۱ را در نیمه سمت چپ نگهداری می‌کند (به اصطلاح میدان ) و عدد ۲ را در نیمه سمت راست (میدان ) نگهداری می‌کند. در نمادسازی لیسپ، مقدار  به این صورت است:

(۱. ۲)

به نقطه بین ۱ و ۲ توجه کنید؛ این نقطه نشان‌دهنده آن است که عبارت-S یک «جفت نقطه‌دار» (به اصطلاح "cons pair")، و نه یک "لیست" است.

لیست‌ها 

در لیسپ، لیست‌ها روی زوج‌های cons پیاده‌سازی می‌شوند. به صورت بخصوص، هر ساختار فهرست در لیسپ،
 یا لیست خالی  است، که یک شیء خاص است که معمولاً به آن  گفته می‌شود.
 یا یک سلول cons است که در آن  اولین عنصر لیست است، و  خودش یک لیست است که شامل مابقی عناصر است.

درخت‌ها 
درخت‌های دودویی که داده را فقط در برگ‌هایش نگهداری می‌کند نیز توسط  ساخته می‌شوند. برای مثال کد:
(cons (cons 1 2) (cons 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)))
این فن کدگذاری چرچ نام دارد.

پانویس

منابع 

انواع داده ترکیبی
انواع داده
برنامه‌نویسی تابعی
لیسپ
مقاله‌های دارای کد مثال اسکیم (زبان برنامه‌نویسی)
مقاله‌های دارای کد مثال لیسپ (زبان برنامه‌نویسی)