تابع 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) به این صورت است:

(۱. ۲)

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

لیست‌ها ویرایش

 
نمودار سلول cons برای لیست (۴۲ ۶۹ ۶۱۳)، که توسط cons اینگونه نوشته می‌شود:
(cons 42 (cons 69 (cons 613 nil)))
و با list اینگونه نوشته می‌شود:
(list 42 69 613)

در لیسپ، لیست‌ها روی زوج‌های cons پیاده‌سازی می‌شوند. به صورت بخصوص، هر ساختار فهرست در لیسپ،

  1. یا لیست خالی () است، که یک شیء خاص است که معمولاً به آن nil گفته می‌شود.
  2. یا یک سلول cons است که در آن car اولین عنصر لیست است، و cdr خودش یک لیست است که شامل مابقی عناصر است.

درخت‌ها ویرایش

درخت‌های دودویی که داده را فقط در برگ‌هایش نگهداری می‌کند نیز توسط 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)))

این فن کدگذاری چرچ نام دارد.

پانویس ویرایش

منابع ویرایش

مشارکت‌کنندگان ویکی‌پدیا. «cons». در دانشنامهٔ ویکی‌پدیای انگلیسی، بازبینی‌شده در ۱ اردیبهشت ۱۴۰۰.