دوست عزیز، به سایت علمی نخبگان جوان خوش آمدید

مشاهده این پیام به این معنی است که شما در سایت عضو نیستید، لطفا در صورت تمایل جهت عضویت در سایت علمی نخبگان جوان اینجا کلیک کنید.

توجه داشته باشید، در صورتی که عضو سایت نباشید نمی توانید از تمامی امکانات و خدمات سایت استفاده کنید.
صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از شماره 1 تا 10 , از مجموع 17

موضوع: طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    آشنایی

    لیسپ توسط جان مک کارتی و گروهی در موسسه تکنولوژی ماساچوست در حدود سال 1960 طراحی شد به طور گسترده برای پژوهش علم کامپیوتر به خصوص هوش مصنوعی بکار گرفته شد. در 30 سال گذشته نسخه های گوناگونی از این زبان طراحی شدند از بین همه زبان های موجود لیسپ زبانی است که استاندارد شده است و پیاده سازی خاصی از آن شهرت یافته است .
    لیسپ از جهات بسیاری با زبان های دیگر متفاوت است. اغلب به شکل برنامه و داده ها در زبان بر می گردد که اجازه میدهد ساختمان داده ها به عنوان برنامه اجرا شوند و برنامه ها مثل داده ها اصلاح شوند. ویژگی دیگر آن تاکید بر بازگشتی به عنوان ابزار کنترل است.
    محاسبات نمادین برنامه نویسیAI (هوش مصنوعی) شامل دستکاری نمادها است نه اعداد.این نماد ها میتوانند اشیا در جهان و ارتباط بین آن را نشان دهند- ساختارهای پیچیده نمادها نیاز به دانش ما از جهان دارند. واژه ساختار اساسی داده ها در lisp واژه ای است که می تواند یک ثابت، یک متغییر یا یک ساختار باشد. ساختارها موضوعات ریز محاسبات گزاره ای را نشان می دهند و شامل یک عملگر نام و یک پارامتر لیست هستند.
    زبانهای برنامه نویسی هوش مصنوعی ابزار اصلی بررسی و ساخت برنامه های کامپیوتری هستند که می توانند در شبیه سازی فرایندهای هوشمند مانند یادگیری، استدلال و فهم اطلاعات نمادین بکار روند. هر چند اخیرا" زبان کامپیوتر اصولا" برای استفاده از کامپیوترها برای انجام محاسبات با اعداد طراحی شده بود، اما بزودی دریافتند که رشته ای از بیتها نه تنها اعداد بلکه می توانند اشیای دلخواه را نیز نمایش دهند. عملیات روی ویژگی ها یا نمادها می تواند با استفاده از قوانین برای ایجاد ، انتساب یا دستکاری نشان داده شود. این تصور از محاسبات نمادین بعنوان تعریف الگوریتمهایی که هر نوع اطلاعات را پردازش می کنند و بنابراین می تواند برای شبیه سازی هوش انسان بکار برود مناسب است.
    درAI خودکار کردن یا برنامه نویسی همه جنبه های شناخت انسانی بوسیله بنیادهای شناخت علمی روشهای نمادین و غیر نمادین AI، پردازش زبان طبیعی، دید کامپیوتری و سیستمهای تکامل یا سازگار مطرح می شود. لازم است دامنه مسئله های خیلی پیچیده در ابتدای مرحله برنامه نویسی یک مسئله AI معین، مشخص شود که کافی نیست. تنها بوسیله تعامل و افزایش اصلاحات خصوصیات بسیار دقیق ممکن است. در حقیقت مسئله های معمول AI به بسیاری از زمینه های خاص گرایش دارند، بنابراین روشهای ذهنی باید بوسیله تولید و آزمایش روشها بطور تجربی توسعه یابند(مشهور به نمونه سازی سریع). در اینصورت برنامه نویسیAI بطور قابل توجهی با روشهای استاندارد مهندسی نرم افزار متفاوت بوده زیرا برنامه نویسی معمولا از یک مشخصات رسمی با جزئیات شروع می شود. در برنامه نویسی AI پیاده سازی در واقع جزئی از پردازش مشخصات مسئله است. به اقتضای طبیعت مسئله های AI برنامه نویسیAI مزایای بسیاری دارد اگر زبانهای برنامه نویسی، برنامه نویس AI را آزاد بگذارند و در بسیاری از ساختارهای فنی محدود نکنند (مانند ساختار انواع داده ای جدید سطح پایین، دستیابی دستی به حافظه). ترجیحا" سبک برنامه نویسی اعلانی برای استفاده در ساختارهای پیش ساخته داده ای سطح بالا(مانند لیستها و درختها) و عملیات(مانند تطبیق الگوها) مناسب است، بنابراین محاسبات نمادین سطح خلاصه سازی بیشتری نسبت به آنچه که با زبانهای دستوری استاندارد مانند فرترن،پاسکال یا سی امکان پذیر خئاهد بود را پشتیبانی می کند. البته طبقه بندی خلاصه سازی آسان نیست ، زیرا تدوین برنامه های AI روی کامپیوترهای استاندارد وان نیومن نمی تواند به کارآمدی زبانهای دستوری باشد. هرچند یک مسئله مسلم AI فهم آن است (حداقل جزئیات) امکان دارد با تنظیمات مجدد آن به شکل خصوصیات جزئی شده با بکار بردن یک زبان دستوری پیاده سازی مجدد شود.
    با توجه به نیازمندیهای محاسبات نمادین و برنامه نویسی AI دو الگوی جدید برنامه نویسی که به سبک دستوری پیشنهاد می شوند بوجود می آید: سبک برنامه نویسی تابعی و منطقی. هر دو بر مبنای ریاضیات طرح ریزی شده اند، یعنی نظریه توابع بازگشتی و منطق رسمی. اولین زبان برنامه نویسیAI کاربردی که هنوز هم بطور گسترده استفاده می شود زبان برنامه نویسی lisp است.lisp بر مبنای نظریه توابع ریاضی و خلاصه سازی lambda است. تعدادی از کاربردهای مهم و موثرAIدرLisp نوشته شده است.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

  2. کاربرانی که از پست مفید بانوثریا سپاس کرده اند.


  3. #2
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    امکانات محیط برنامه نویسی و نحوه اجرای برنامه ها


    Syntax(نحو) وsemantics(معانی) lisp

    1.عبارات نمادین:
    عناصر نحوی lisp عبارات نمادین نامیده می شوند(که به صورتS-expressions شناخته شده اند) داده ها و توابع ( یعنی برنامه های lisp) بصورت عبارات نمادین نشان داده شده اند که می توانند اتم ها یا لیست باشند. اتم ها کلمه ای شبیه اشیا هستند. اتم ها وابسته به نوع کاراکترهایی که برای شکل دادن یک اتم مجازند می توانند به انواع مختلفی تقسیم شوند. انواع اصلی عبارتند از:
    Numbers:1 234-43.14159265358979 -7.5 6.02E+23
    Symbols : symbolsym23another-one t false NILBLUE
    Strings: "this is a string""977?" "setq""he said:\"I'm here.\""
    توضیح اینکه هر چند نماد خاصی مثلBLUE استفاده می شود چون مفهوم مشخص برای برنامه نویسی دارد، اما بزودی lisp تنها ترتیبی از حروف یا تنها نماد است. لیستها بندی شبیه اشیا هستند. یک لیست شامل یک پرانتز باز ( دنباله ای از اعداد دلخواه که بوسیله فاصله خالی از هم جدا می شوند)و یک پرانتز بسته هستند. هر عنصر لیست می تواند یک اتم یا لیست باشد. اینها مثال هایی از لیستها هستند:
    (this is a list) ((this) ((too))) () (((((((())))))))
    (a b c d) (john mary tom) (loves john ?x)
    (* (+ 3 4)8)(append(a b c)(1 2 3))
    (defun mmber (elem list)
    (if (eq elem (first list)) T
    (membr elem (rest list))))

    توضیح اینکه در بسیاری از مثالها عناصر لیستها هستند. چنین لیستهایی، لیستهای تو در تو نامیده می شوند. در مورد تو در تویی محدودیتی وجود ندارد. برای مثال یکی از قویترین lisp ها را شرح می دهیم: پیچیده ترین اشیاء را به راحتی می توان نوشت. تنها چیزی که در نظر گرفته می شود درستی عدد داخل پرانتزهاست. مهم توشضیح این است که معنی وابسته به یک لیست نمایش ویژه یا اتم در لیست نمایش وارد نمی شود. به این معنی که همه عبارات نمادین که در بالا توصیف شده است از لحاظ نحو برنامه های lisp را اصلاح می کنند ولی الزاما" از لحاظ معنی برنامه ها را اصلاح نمی کنند.


    2.semantics(معانی):
    هسته هر سیستم برنامه نویسی lispمفسر است که کارش محاسبه مقداربرای یک عبارت نمادین شده است. که بعد از کامل شدن ارزیابی برگردانده شده است. توضیح اینکه در واقعlisp دارایsemantics عملیاتی است که با یک تعریف ریاضی دقیق از نظریه تابع بازگشتی بدست می آید.
    حلقه خواندن- محاسبه – چاپ چگونه می تواند مفسر lisp را فعال کرده و برای محاسبه عبارات نمادین و بنابراین اجرای واقعی برنامه های lisp بکار برود؟
    مسئله های prologبصورت حقایق،بدیهیات و قوانین منطقی برای استنباط حقایق جدید بیان می شوند.prolog با قانون ریاضی در محاسبات گزاره ای و نتایج نظری بدست آمده در زمینه اثبات قضیه خودکار در اواخر دهه 1960 بنا شده است. مفسر lisp در واقع بعنوان یک تابع معمولا" بنام eval و جزئی از هر محیط برنامه نویسی lisp است تعریف شده است(مانند تابعی که پیش ساخته نام دارد).
    آن بوسیله فراخوانی حلقه خواندنی – محاسبه – چاپ در یک سیستم lispجاسازی می شود، وقتی یک عبارت نمادین توسط کاربر داده می شود ابتدا به داخل سیستم lisp خوانده می شود(خواندن هم یک تابع پیش ساخته است). سپس مفسر lisp که via نام دارد تابع eval را فراخوانی می کند تا عبارت نمادین را محاسبه و نتیجه عبارت نمادین را با چاپ در دستگاه کاربر برگرداند. وقتی سیستم lisp در کامپیوتر شروع به اجرا کرده و بوسیله علامت ویژه اعلانlispدر ابتدای خط جدید به کاربر علامت می دهد در اینجا ما علامت (؟) را به عنوان اعلان lisp بکار خواهیم برد. برای مثال:
    (+ 4 3) ?
    7
    هروقت سیستم lisp اجرا شود حلقه خواندن – محاسبه – چاپ فعال خواهدبود.
    عبارت نمادین(+3 4) که بوسیله هکرlisp وارد شده است بوسیله مفسر lisp بصورت فراخوانی تابع جمع تفسیر شده و نتیجه عبارت نمادین در ابتدای خط جدید7 چاپ میشود ارزیابی مفسرlisp مطابق 3 قانون زیر انجام می شود:

    1:یکسانی
    یک عدد ، یک رشته یا نمادهای t,nil خودشان را ارزیابی میکنند به این معنی که ارزش عدد3،3 و ارزش رشته "house"، رشته" house" است . نمادt مقدار t بر می گرداند که به معنای فقعث تفسیر می شود و nil،به معنی false بر می گرداند.
    2: نمادها
    ارزیابی یک نماد عبارت نمادین مربوط به آن را برمی گرداند. بنابراین اگر ما فرض کنیم نماد*names* به لیست(john mary tom) وابسته است آنگاه ارزیابی*names* آن لیست را نتیجه می دهد. اگر نمادcolor را به نمادgreen وابسته کنیم آنگاهgreen بعنوان مقدارcolor برگردانده می شود.
    به بیان دیگر نمادها بعنوان متغییرهایی که به مقادیری متصل شده اند تفسیر می شوند.
    3:لیستها
    هر لیست بعنوان یک فراخوانی تابع تفسیر می شود.مفسر اول لیست دلالت بر تابعی دارد که باید برای بقیه عناصر(بالقوه خالی) که آرگومانهای آن تابع را نشان می دهند بکار رود. در واقع آرگومانهای یک تابع قبلا بصورت نمادهای پیشوندی مشخص می شوند. این مزیت را دارد که توابع بسادگی می توانند با تعداد دلخواهی آرگومان مشخص و استفاده شوند.ایست خالی() دارای عبارت نمادینnil بعنوان مقدارش می باشد. توضیح اینکه نمادnilدر واقع دارای دو معنی است:یک نمایش مقدار منطقی false و دیگری نمایش لیست خالی. هر چند ممکن است این یک بیت فرد بنظر برسد،ولی در واقع lisp مشکلی در شناسایی مفهومnilبکار رفته وجود ندارد.
    ولی به طور کل آرگومانها قبل از اینکه توابع مقادیر آنها را استفاده کنند ارزیابی می شوند. اولویت ارزیابی ترتیبی از آرگومانها از چپ به راست است. یک آرگومان ممکن است یک اتم یا یک لیست باشد،در هر حالت بعنوان یک فراخوانی تابع تفسیر شده و مفسرlisp برای ارزیابی آن فراخوانی می شود. برای مثال، ارزیابی زیر در سیستم lisp یک تابع به حساب می آید:
    ?(max 4(min 9 8)7 5)
    8
    در اینجا آرگومانها(min 9 8)7 5) هستند که دراولویتی قبل از تابعی به نام max که نتیجه مقادیر آرگومانها را بکار می برد ارزیابی می شوند.آرگومان اول 4، یک عدد است پس مقدار آن 4 است. آرگومان دوم(min 9 8) است که خودش یک فراخوانی تابع است. بنابراین باید قبل از آرگومان سوم فراخوانی شود،(min 9 8) باید توسط مفسر lisp ارزیابی شود چون ما باید مفسرlisp را برای بعضی آرگومانها در طول ارزیابی همه فراخوانی های توابع استفاده کنیم می توان گفت مفسرlisp بصورت بازگشتی فراخوانی شده است . مفسرlisp همان مراحل را به کار می برد، پس آرگومان اول 9 قبل از آرگومان دوم8 ارزیابی می شود. با کار برروی تابعmin حاصل8 می شود یعنی تابع کوچکترین عدد یک مجموعه از اعداد صحیح را محاسبه می کند. برای تابع بیرونی max هم به این معنی است که آرگومان دوم آن 8 ارزیابی می شود.
    آرگومانهای بعدی 5و7هستند که نتیجه ارزیابی آنها مقادیر 5و7 می شود.حال تابع بزرگترین عدد که max نام دارد می تواند ارزیابی شود که مقدار8 برمی گرداند. این مقدار نهایی، مقدار فراخوانی همه توابع می باشد. از آنجایی که گفته می شود مفسر lisp همیشه سعی می کند مقدار یک نماد یا تفسیر یک لیست بعنوان یک فراخوانی تابع را تشخیص دهد ما چگونه می توانیم با نمادها و لیستها بعنوان داده رفتار کنیم؟ برای مثال،اگر ما لیست (peter home walks) را وارد کنیم ، آنگاه مفسر lisp فورا" یک خطا می دهد که چیزی شبیه این خطا می گوید : تابع peter ناشناخته است یا اگر ما فقط houseرا وارد کنیم،آنگاه مفسرlisp با خطایی شبیه این خطا خاتمه می یابد مقداری به house متصل نیست.حل این مسئله کاملا" آسان است زیرا عنصر اصلی هر لیست بعنوان نام تابع تفسیر می شود، هر سیستم lisp با یک تابع پیش ساخته quote می آید که یک عبارت نمادین را بعنوان آرگومان پذیرفته و این عبارت نمادین را بدون ارزیابی آن بر می گرداند.
    برای مثال: لیست((quote(peter walks home)، به سادگی مقدار (peter walks home) را بر می گرداند، و برای (quote house) ،house را بر می گرداند. از آنجایی که تابع qute زیاد استفاده می شود، می توان آن را با کاراکتر ویژه ' بیان کرد. بنابراین برای مثال بالا می توانیم معادل(home peter walks)' وhouse' را مشخص کنیم. برنامه ها بعنوان داده، یعنی تابع quote به ما امکان می دهد تا با فراخوانی تابع بعنوان داده رفتار کنیم.
    برای مثال:
    (max 4(min 9 8) 7 5)'یا((min 9 8 )7 5) ute(max 4)
    قبلا گفتیم که مفسر lispیک تابع یکتایی پیش ساخته است که eval نام دارد.آن صریحا" آرگومانهایش را وادار می کند تا مطابق قوانین مذکور در بالا ارزیابی شوند. در بعضی حالات، آن می تواند مقابل تابعquote قرار بگیرد بنابراین به وضوح لازم است که یک لیست بعنوان داده مشخص شود تا سیستم lisp بتواند یک فراخوانی تابع تفسیر شود،ما می توانیم (9max 4(min 9 8)7 5)' را مشخص کنیم که مقدار 8 را بطوری که در بالا توصیف شد بر می گرداند. به همان صورت مشخص کردنeval '(peter)((walks home سبب یک خطای lisp می شود زیراlisp سعی می کند یک تابع peter فراخوانی کند. مزیت اصلی رفتار برنامه ها بعنوان داده این است که ما می توانیم برنامه های lisp(توابع) را طوری تعریف کنیم که قادر به ساخت یا تولید برنامه ها باشند بطوریکه ابتدا لیست نمایش متناظر را ساخته و سپس با استفاده از تابعeval، مفسر lisp را به منظور ارزیابی لیست ایجاد شده بعنوان یک تابع فراخوانی می کند. شگفت آور نیست که به اقتضای این خصوصیات،lisp هنوز زبان برنامه نویسی برتر در زمینه برنامه نویسی ژنتیکAI است.
    وقتی مقادیر را به نمادها تخصیص می دهیم که برنامه نویسی برنامه های کاربردی real-life به ذخیره مقادیری محاسبه شده در یک متغییر نیاز داشته باشد تا اگر در آینده در برنامه دیگری نیاز باشند از هزینه محاسبه مجدد آن جلوگیری شود. در یک نگارش کاملا" تابعی lisp مقدار یک تابع تنها به تعریف تابع و مقدار آرگومانهایش در فراخوانی بستگی دارد. برای اینکه lisp را یک زبان کاربردی بکنیم، ما نیاز به روشی داریم تا مقادیر را به نمادها تخصیص دهیم.common lisp با یک تابع پیش ساخته بنامsetq می آید.setq دو آرگومان می خواهد: نماد(بنام متغییر) که یک مقدار به آن متصل شده است و یک عبارت نمادین که باید مقداری را فراهم کند. مفسرlisp ارزیابیsetq را در روش خاصی انجام میدهد بطوریکه آرگومان اولsetq را ارزیابی می کند(متغییر)، اما مقدار آرگومان دوم setq را به متغییر متصل می کند.مقدار آرگومان دومsetq مقدارsetq را بر می گردانداینها مثالهایی هستند:
    ?color
    Error: unbound symbol color
    ?(setq color 'green)
    Green
    ?(setqmax(max 3 2 5 1))
    3
    توضیح اینکه در واقع setq حالت مفسرlisp را تغییر می دهد تا دفعه بعدی که همان متغییر استفاده می شود، دارای مقدار بوده و بنابراین مفسر lisp قادر به بازگرداندن آن خواهد بود. اگر این اتفاق نیفتد آنگاه مفسر lisp یک اخطار خواهد داد زیرا نماد متصل نشده است.(گام 2 مفسر lisp پیدا نشد). بنابراین آن می گوید که setq یک اثر جانبی تولید می کند زیرا حالت مفسرlisp به طور پویا تغییر می دهد. وقتی استفاده از setq اجباری شد، به هر حال متوجه شد که در واقع از مسیرsemantics(معانی)lisp ناب دور می شود. پس setq باید با دقت بسیار استفاده شود.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

  4. #3
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    تعریف توابع جدید
    برنامه نویسی در lisp با تعریف توابع جدید انجام می شود. در اصل این به این معنی است که مشخص کردن لیستها در یک روش نحوی معین. مشابه تابع setq که بوسیله مفسر lisp در یک روش خاص رفتار می کرد. تابع خاصdefun است که برای ایجاد اشیای تابع جدید توسط مفسرlisp بکار می رود.defun یک نماد دال برنامه تابع، یک لیست از پارامترها (ممکن است خالی باشد) برای تابع جدید و تعداد دلخواهی از عبارات نمادینی که بدنه تابع جدید را تعریف می کند را به عنوان آرگومانهایش می پذیرد. این تعویض از یک تابع ساده به نام my-sum است که دو آرگومان می پذیرد و با استفاده از تابع پیش ساخته آنها را جمع می کند.
    (defun my-sum(x y)
    (+ x y))
    این عبارت به همان روشی که به عنوان یک تابع فراخوانی می شود در سیستم lispوارد می شود. ارزیابی یک تعریف تابع نام تابع را بعنوان مقدار برمی گرداند، اما یک شی تابع را بعنوان اثر جانبی ایجاد خواهد کرد و وقتی lispشروع به اجرا می کند آن را به مجموعه تعاریف توابع شناخته شده توسط سیستم lispاضافه می کند
    توضیح اینکه در این مثال بدنه شامل تنها یک عبارت نمادین است. هر چند بدنه می تواند شامل ترتیب دلخواهی از عبارات نمادین باشد مقدار آخرین عبارت نمادین از بدنه مقدار تابع را تعیین می کند. به این معنی است که در واقع همه عناصر بدنه بی تاثیر هستند مگر اینکه اثرات جانبی تصمیم گیری تولید کنند.
    لیست پارامترتابع جدیدmy-sum به ما می گوید وقتی فراخوانی می شود درست دو عبارت نمادین را بعنوان آرگومان می پذیرد. بنابراین اگر شما(my –sum 3 5) را در سیستم lisp وارد کنید مفسرlisp قادر خواهد بود که تعریف برای نام تابع مشخص شده را بیابد و سپس آرگومانهای داده شده را از چپ به راست پردازش کند وقتی این کار انجام شد آن مقدار هر آرگومان را مطابق پارامتر مشخص شده در لیست پارامترتعریف تابع وصل خواهد کرد در مثال نا بدین معنی است که مقدار آرگومان اول که 3 است به پارامتر x متصل می کند سپس مقدار آرگومان دوم که 5 است به پارامترy متصل می شود. چون مقدار یک آرگومان به یک پارامتر متصل می شود،این روش فراخوانی با مقدار نامیده شده است. بعد از مقداریابی برای همه پارامترها مفسرlisp قادر به ارزیابی بدنه تابع خواهد بود. مثال بدین معنی است که (+ 5 3) فراخوانی خواهد شد. نتیجه فراخوانی 8 است که به عنوان نتیجه فراخوانی(my-sum 3 5) برگردانده می شود. بعد از تکمیل فراخوانی تابع اتصالات موقت پارامترهای x ,y حذف می شوند. هنگامی که یک تابع جدید در سیستم lisp وارد می شود می تواند به عنوان جزئی از تعریف تابع جدید به همان روش که بعنوان تابع پیش ساخته استفاده شده است بکار برده شود. بطوریکه در مثال زیر نشان داده شده است.
    (defun double-sum(x y)
    (+(my – sum x y) (my-sum x yy)))
    که با دو بار فراخوانی my – sum جمع آرگومانهایش را دو برابر خواهد کرد این مثال دیگری از یک تابع است نشان دادن استفاده از عبارات نمادین چندگانه در بدنه تابع است.
    (defun hello-world() (print"hello world!")'done)
    این تعریف تابع پارامتری ندارد زیرا لیست پارامترآن خالی است بنابراین وقتی (hello-world) فراخوانی می شود مفسرlisp بلافاصله ("!print "hello world) را ارزیابی و رشته "!hello world" را روی نمایشگر شما بعنوان یک اثر جانبی چاپ می کند سپس نمادdone' را ارزیابی خواهد کرد و done را به عنوان نتیجه فراخوانی تابع بر می گرداند.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

  5. #4
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    تعریف ساختارهای کنترلی

    هرچند اکنون تعریف توابع جدید با تعریف توابع پیش ساخته و توابعی که کاربر تعریف می کند ممکن است برنامه نویسی در lisp بسیار خسته کننده خواهد شد اگر کنترل جریان اطلاعات بوسیله شاخه های شرطی ممکن نبود شاید بارها تکرار شود تا اینکه یک روند توقف اجرا شود گزینش lisp بر مبنای ارزیابی توابع است توابع کنترل تستهایی روی عبارات نمادین واقعی انجام می دهد و ارزیابی عبارات نمادین متناوب را بسته به نتایج انتخاب می کنند تابع اساسی برای تعیین اثباتهای شرطی در lisp,cond است. Cond تعداد دلخواهی آرگومان را می پذیرد هر آرگومان یک بخش ممکن را بیان می کنند و به عنوان یک لیست نمایش داده شده که عنصر اول یک تست و بقیه عناصر اعمال (عبارات نمادین) هستند که اگر تست انجام شود ارزیابی می شوند مقدار آخرین عمل به عنوان مقدار پیشنهادی برگردانده می شود همه آرگومانهای ممکنcond(یعنی بخشها) تا زمانی که بخش اول بطور مثبت تست شود از چپ به راست ارزیابی می شوند در آن حالت مقدار آن بخش مقدار کل تابع cond است. در واقع این مفهوم بسیار پیچیده تر از آن است اجازه دهید تابع verbalize-prop زیر که یک مقدار احتمال را بیان می کند. به عنوان یک عدد حقیقی فرض می کنیم.
    (defun verbalize-prop(prop-value)
    (cond((>prob-value 0.75)'very-probable)
    ((>prob-value 0.5)'probable)
    ((>prob-value 0.25)'improbable)
    (T'very-impobable)))
    وقتی (verbalize – prop 0.33) فراخوانی می شود مقدار واقعی آرگومانها به پارامتر prop-value متصل می شود. سپس cond با آن اتصالات ارزیابی می شودvery-((prop-value<))'(probable است.> یک گزاره پیش ساخته است که تست می کند که آیا آرگومان اول از دومی بزرگتر است، چونpropvalue،0.33 است.به nil ارزیابی می شود که به معنی انجام نشدن تست است. بنابراین این بخش پیشنهادی بلافاصله پایان می یابد. و سپس پیشنهاد(prob-value 0,5)'probable<)) ارزیابی می شود که تابع تست باز هم nil بر می گرداند بنابراین ارزیابی هم پایان می یابد سپس prpp-value 0.25)))('improbable ارزیابی می شود حال با بکار بردن تابع تست T برگردانده می شود که به معنی انجام تست است. آنگاه همه اعمال این بخش که بطور مثبت تست شده است ارزیابی و مقدار آخرین عمل به عنوان مقدار cond برگردانده می شود در مثال ما تنها عمل 'improbable تعیین می شود که مقدار غیر محتمل را برمی گرداند از آنجایی که این مقدار cond را تعیین می کند و عبارت cond تنها عبارت بدنه تابع verbalize-propاست. نتیجه فراخوانی ((verbalize-prop،improbable 0.33) است توضیح اینکه اگر ما (verbalize –prop 0.1) را وارد کنیم مقدار very-improbable را بر می گرداند زیرا تست هر سه با شکست مواجه شده و باید با بخش (very-improbable't(ارزیابی شود در این حالت نماد t به عنوان تستی که همیشه t را برمی گرداند استفاده شده است بنابراین مقدار این پیشنهادvery-improbable است.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

  6. #5
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    توابع مرتبه بالا
    در lisp توابع می توانند بعنوان آرگومان استفاده شود تابعی که بتواند توابع را بعنوان آرگومانهایش بپذیرد تابع مرتبه بالا نامیده می شود. مشکلات فراوانی وجود دارند که یکی از پیمایش یک لیست(یا یک درخت یا یک گراف) است که باید برای هر لیست عنصر تابع معینی استفاده شود . برای مثال filter تابعی است که تستی برای عناصر لیست به کار می برد و آنهایی که شکست می خورند را حذف می کند. نگاشتها توابعی هستند که همان تابع را روی هر عنصر لیست به کار می برند تا لیستی از نتایج را برگردانند . تعاریف توابع مرتبه بالا می تواند برای تعریف توابع عمومی پیمایش لیست استفاده شود که آنها از توابع خاصی که برای پردازش عناصر لیست بکار می روند خلاصه می شوند . به منظور پشتیبانی تعاریف مرتبه بالا یک تابع خاص است که یک تابع و دنباله ای از آرگومانها را به عنوان آرگومان می پذیرد و آن تابع را در آرگومانهای آنها به کار می برد. به عنوان مثال با استفاده از funcall ، تابع عمومی filter را تعریف خواهیم کرد که می تواند به این صورت فراخوانی شود:
    (6 3 1)<= =(filter '( 1 3 -9 -5 6 -3)#'plusp)
    Plusp یک تابع پیش ساخته است که کنترل می کند آیا یک عدد داده شده مثبت است یا نه؟ اگر باشد آن عدد را بر می گرداند در غیر این صورت nil بر می گرداند نماد خاص # بکار می رود تا به مفسرlisp بگوید ک مقدار آرگومان یک شی تابعی است. تعریف به صورت زیر است:
    (defun filter ( list test)
    (cond ((null list) list)
    ((funcall test (car list))
    (cons (car list)(filter (cdr list)test)))
    (T (filter (cdr list)test))))
    اگر لیست خالی باشد آنگاه بسادگی بر میگردد در غیر این صورت تابع تست روی عنصر اول لیست بکار می رود. اگر تابع تست موفق شودcons بکار می رود تا لیست حاصل را با استفاده از این عنصر و همه ی عناصری که در طول فراخوانی بازگشتی filter از cdr و تابع تست استفاده می کنند بسازد. اگر تابع تست برای عنصر اول با شکست مواجه شود این عنصر بسادگی با بکار بردن filter بصورت بازگشتی روی عناصر باقیمانده پرش می کند. یعنی این عنصر نمی تواند جزئی از لیست حاصل باشد تابع می تواند برای بسیاری از توابع مختلف تست استفاده شود مانند:
    (filter '(1 3 A B 6 c 4) #'numberp)= =>(1 3 6 4)
    (filter '(1 2 3 4 5 6)#'even)= =>(2 4 6)

    به عنوان مثال دیگری از تعریف filter تابع مرتبه بالا، ما می خواهیم یک تابع نگاشت ساده تعریف کنیم که یک تابع روی همه عناصر یک لیست بکار رفته ، لیستی از همه مقادیر بر می گرداند. اگر تابعmy-map را فراخوانی کنیم آنگاه تعریفی شبیه این داریم:
    (defun my-map(fn list)
    (cond ((null list) list)
    (T(cons(funcall fn(car list))(my-map fn(cdr list))))))
    اگر یک تابع double وجود داشته باشد که تنها عدد را دو برابر کند آنگاه یم فراخوانی ممکنmy-map به این صورت می تواند باشد:
    (8 6 4 2) < = my-map#'double'(1 2 3 4)
    بارها شده که یک تابع باید یکبار استفاده می شد. بنابراین اگر ما بتوانیم مستقیما تعریفی از یک تابع بعنوان آرگومان از تابع نگاشت فراهم کنیم کاملا مناسب خواهد بود برای اینکار تعریف عبارت lambda را پشتیبانی می کند. در lispعبارات lambda با استفاده از نوع خاصی از lambdaتعریف می شوند نوع عمومی عبارت lambda به این صورت است:
    (lambda(parameter…)body…)
    یک عبارت lambda امکان می دهد تا ما تعریف تابع را از نام تابع تشخیص دهیم عباراتlambda می توانند به جای نام تابع در تابع funcall استفاده شوند مانند عبارت که تابع double ما می تواند باشد:
    (lambda(x)(+xx))
    برای مثال: فراخوانی تابع my-map بالا می تواند با استفاده از عبارت lambda مجددا" به صورت زیر بیان شود:
    (my-map #'(lambda(x)(+xx))'( 1 2 3 4)= =>( 2 4 6 8)
    یک عبارت lambda یک شی تابعی بر می گرداند که به نام تابع متصل نیست در تعریف my-map، پارامترfn را بعنوان متغییر نام تابع استفاده می کنیم. وقتی شکل lambda محاسبه شد مفسر lisp شی تابعی را به متغییر نام تابع متصل خواهد کرد. به این طریق یک پارامتر تابع بصورت یک نام تابع پویا استفاده می شود. نماد# ضروری است تا به lispبگوید که نه تنها یک شی تابعی را وصل کند بلکه باید اتصالات محلی و سراسری مقادیر وابسته به شی را نیز نگه دارد. این تنها با استفاده از عملگر quote امکان پذیر نخواهد بود.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

  7. #6
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    مدل زبان و کاربردهای زبان

    برنامه نویسی تابعی در lisp
    Lisp اولین زبان برنامه نویسی تابعی است: آن برای پشتیبانی محاسبات نمادین با استفاده از لیستهای پیوندی بعنوان ساختار مرکزی داده ها ابداع شده بود(lisp یعنی پردازشگر لیست( جان مک کارتی دریافت که روشهای کنترل جریان توابع ریاضی (بازگشت و تکرار)وسیله نظری مناسبی برای انجام محاسبات نمادین هستند. علاوه براین خلاصه سازی تابعی و کاربرد تابعی تعریف شده در محاسبات lambda، سطح بالایی از خلاصه سازی مورد نیاز برای مسئله های AI مشخص شده را فراهم می کنند.
    از کاربردهای این زبان می توان به هوش مصنوعی اشاره کرده تمایل به زبانهای هوش مصنوعی در دهه ی 1950 با ipl شروع شد ولی کاربردش توسط طراحی سطح پایین آن محدود شده است موفقیت بزرگ وقتی حاصل شد که جان مک کارتی از MIT زبان لیسپ را برای IBM 704 طراحی کرد لیسپ1.5 برای سالهای متوالی استاندارد شد لیسپ برای کارهای جستجو بسیار مناسب است. بازهای کامپیوتری و پردازش متن در لیسپ به خوبی پیاده سازی می شود. تفسیر ماشین خودکار که در آن رشته هایی از نمادها می تواند توسط رشته های دیگری جایگزین شود. زمینه ی دیگری برای کاربرد لیسپ محسوب می شود.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

  8. #7
    کاربر جدید
    نوشته ها
    1
    ارسال تشکر
    0
    سپاس شده 1 در 1 پست
    قدرت امتیاز دهی
    0
    Array

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    با سلام
    منظور از تفسیر ماشین خودکار چیست؟ اینکه مجموعه ای از نمادها با نمادهای دیگر جابه جا میشوند به چه معناست؟ ممکن است خواهش کنم با مثال توضیح دهید؟
    ممنونم

  9. کاربرانی که از پست مفید fat321 سپاس کرده اند.


  10. #8
    کاربر جدید
    رشته تحصیلی
    مهندسی کامپیوتر - نرم افزار
    نوشته ها
    104
    ارسال تشکر
    486
    دریافت تشکر: 220
    قدرت امتیاز دهی
    26
    Array

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    لیسپ لیسپ یک زبان برنامه‌نویسی رایانه است که در سال ۱۹۵۸ به وسیلهٔ جان مک‌کارتی ابداع شده‌است. این زبان، مانند زبان برنامه‌نویسی پرولوگ، بیشتر برای برنامه‌نویسی هوش مصنوعی مورد استفاده قرار می‌گیرد. با توجه به اینکه زبان لیسپ از نحو ساده‌ای برخوردار است، تجزیه و پیاده‌سازی آن نسبتاً با سهولت انجام می‌شود.
    متن برنامه‌های لیسپ عموماً از نمادها و لیست‌هایی از نمادها تشکیل می‌شود و بدین خاطر است که این زبان لیسپ (مخفف پردازش لیست) نامیده شده‌است. یکی از ویژگی‌های جالب زبان لیسپ این است که خود برنامه‌های لیسپ نیز لیست هستند و بنا بر این، می‌توان با برنامه‌ها به عنوان داده‌ها رفتار کرد و یا داده‌ها را به عنوان برنامه ارزیابی نمود.
    لیسپ دارای گویش‌های مختلفی است که بعضی از آنها دارای قابلیت‌های شیءگرا نیز هستند. از این میان می‌توان به کامن لیسپ اشاره کرد.
    در ابتدا لیسپ به عنوان علامتگذاری و نمادسازی ریاضیات و برای برنامه‌های کامپیوتری ابداع شد.زبان لیسپ به سرعت مورد توجه برنامه نویسان از جمله برای تحقیقات علمی هوش مصنوعی قرار گرفت.لیسپ یکی از ابتدائی ز بان‌های برنامه نویسی می‌باشد،ودر علوم کامپیوتر بر بسیاری از تفکرات و ایده‌ها پیشگام بود.لیسپ شامل ساختمان دادهٔ درخت،مدریت نگهداری اتوماتیک،برنامه نویسی پویا،برنامه نویسی شی گرا و کامپایلر مستقل می‌باشد.
    نام لیسپ از زبان پردازش لیسپ گرفته شده‌است.لینک لیست یکی از قسمت‌های اصلی ساختمان دادهٔ زبان لیسپ است و سورس کد لیسپ از لیست‌ها ساخته شده‌است و می‌تواند به عنوان ساختمان داده عمل کند.پیشرفت و توسعهٔ سیستم ماکرو به برنامه نویسان اجازه می‌دهد تا ترکیب‌های جدید ویا حتی حیطهٔ زبان‌های برنامه نویسی ویژه‌ای را ایجاد کرده و در زبان لیسپ تعبیه کنند. قابلیت تبادل کدها و داده‌ها به زبان لیسپ قابلیت تشخیص ترکیب‌ها را می‌دهد،همهٔ کدهای برنامه به صورت عبارت‌های نمادین یا لیست‌های پرانتز گذاری شده نوشته شده‌اند.
    یک تابع می‌تواند توسط خودش ویا توابع دیگر فراخوانی شود ویا طبق قواعد نحوی نوشتن یک لیست و استفاده از اول نام عملگرها و پیروی کردن از قواعد آرگومان‌ها ایجاد شود.به عنوان مثال تابع fدارای 3 آرگومان می‌باشد و به صورت مقابل توانائی فراخوانی را دارد و مورد استفاده قرار می‌گیرد:

    (f x y z)
    زبان برنامه نویسی لیسپ توسط جان مک کارتی در سال 1958 در حالی که در مؤسسهٔ فناوری ماساچوست (MIT) بود ابداع شد.مک کارتی طرح خودش را در یک مقالهٔ مرتبط با انجمن ماشین آلات کامپیوتری در سال 1960 منتشر کرد.طرح وی در ابتدا به صورت «بخش اول:توابع بازگشتی از دید عبارت‌های نمادین و محاسبهٔ آنها توسط ماشین» ارائه شد و بخش دوم آن هیچگاه منتشر نشد.وی نشان داد که با یک تعداد ساده و کمی از عملگرها و علمتگذاری توابع می‌توان یک زبان تورینگ کامل برای الگوریتم‌ها ایجاد کرد. زبان پردازش اطلاعات اولین زبان هوش مصنوعی بود. از سال 1955 یا 1956 و پیش از آن ایده‌های بسیاری بر زبان لیسپ وارد شد از جمله پردازش لیست و توابع بازگشتی که در زبان لیسپ به کار برده شد. ثبت‌های اصلی مک کارتی به صورت عبارت‌های غیر نمادین که خواستار تفسیر کردن و برگرداندن به عبارت‌های نمادین بود.به عنوان مثال عبارت غیر نمادین car[consA,B معادل عبارت نمادین (car (cons A B)بود که در زبان لیسپ به کار گرفته شده بود.برنامه نویسان به سرعت عبارت نمادین را انتخاب و عبارت‌های غیر نمادین را ترک کردند.
    لیسپ برای اولین بار توسط استفان راسل روی یک کامپیوتر IBM 704 اجرا شد. راسل مقالهٔ مک کارسی را مطالعه کرد و دریافت که توابع لیسپ می‌توانند در کد ماشین اجرا شوند. این نتیجه از مطالعه و دریافت راسل نشان می‌دهد که مفسر لیسپ می‌توانست برای اجرای برنامه‌های لیسپ و ارزیابی صحیح عبارت لیسپ استفاده شود.
    دو زبان اسمبلی به عنوان دو عملیات اصلی و ابتدائی تجزیه و جدا کردن عناصر اصلی لیست برای IBM 704 شد.این دو زبان اسمبلی car (مضمون آدرس ثبات) و cdr (محتوای کاهش میزان ثبات‌ها) نسخهٔ لیسپ هنوز ازcar وcdr برای عملیاتی که اولین عنصر در یک لیست و باقی ماندهٔ لیست را برمی‌گرداند،استفاده می‌کند.
    اولین کامپایلر تکمیل شدهٔ لیسپ،در سال 1962توسط تام هارت و مایک لوین در MIT اجرا شد، این کامپالر معرفی شده مدل لیسپ با کامپایلر نحوی در هر کامپایل و ترجمهٔ توابع می‌تواند به طور رایگان در هم بیامیزد.
    زبان به کار گرفته شده در ثبت هارت و لوین نسبت به کدهای ابتدائی مک کارتی به شیوهٔ لیسپ مدرن و جدید نزدیک تر می‌باشد.

    پیوستن به هوش مصنوعی:
    بعد از شروع لیسپ ، لیسپ به انجمن تحقیقاتی هوش مصنوعی پیوست ، خصوصا به سیستم‌های PDP ، زبان لیسپ به عنوان پیاده ساز طرح کوچک زبان برنامه نویسی استفاده می‌شود که مبنایی برای سیستم معروف هوش مصنوعی SHRLU بود.
    در سال 1970 تحقیقات علمی هوش مصنوعی به شاخه‌های تجاری انشعاب پیدا کرد که کارایی سیستم لیسپ موجود در این زمینه یک روند رو به رشد شد.
    لیسپ یک سیستم مشکل برای اجرا، مهارت کامپایلر و سخت افزار ذخیره کننده را در سال 1970 دارا باشد. بازیابی عادی حافظه ، توسط دانشجوی فارغالتحصیل MIT ( دانیل ادوارد ) گسترش داده شده ،که برای اجرای لیسپ روی سیستم‌های محاساتی ساخته شده بود اما راندمان آن هنوز یک مشکل بود. برای رهبری ماشین لیسپ: سخت افزار اختصاصی برای اجرای محیط لیسپ و برنامه‌های آن استفاده می‌شود. پیشروی در هردو سخت افزار کامپیوتر و فناوری کامپایلر از ماشین‌های لیسپ از کار افتاده الهام گرفته شده‌است.
    طی شک کوشش بزرگ نسخه‌های بیشماری از زبان لیسپ را در یک زبان واحد متمرکز و متحد کردند(نسخه‌های برجسته و قابل ملاحظه‌ای شامل: اینترلیسپ ، مک لیسپ ، متالیسپ ، و فرانزلیسپ) زبان‌های جدید (لیسپ عمومی و مشترک ) در اصل یک زیر مجموعهٔ سازگاری از نسخه‌های تعویض شده بود. در سال 1994 ، ANSI یک لیسپ عمومی و مشترک استاندارد منتشر کرد. لیسپ عمومی و مشترک زبان برنامه نویسی فناوری اطلاعات ANSI X3.226-1994 در آن زمان فروشگاه‌های جهانی برای لیسپ خیلی کوچکتر از المان بود.
    ترکیب و معنا شناسی:
    لیسپ یک عبارت جهتدار است ، برخلاف بیشتر زبان‌های دیگر ، بین عبارت‌ها و جمله‌ها تمایز و فرقی وجود ندارد . همهٔ کدها و داده‌ها به عنوان عبارت‌ها نوشته شده‌اند – زمانی که یک عبارت ارزیابی می‌شود یک مقدار ( یا یک لیستی از مقادیر) را می‌سازد ، که آن هم در داخل عبارات دیگر جاسازی می‌شود.
    مقالهٔ 1958 مک کارتی دو نوع از ترکیب‌ها را معرفی کرد: عبارت نمادین ***ps هم نامیده می‌شود ، که بازتابی از نمایش داخلی کدها و داده هاست و عبارت غیر نمادین هرگز مورد توجه قرار نگرفت و تقریبا همهٔ زبان‌ها امروزه از عبارات نمادین استفاده می‌کنند.
    استفاده از پرانتزگذاری‌ها تفاوت بسیار آشکار و مشهودی میان لیسپ و دیگر زبان‌های برنامه نویسی ایجاد کرده‌است . اسم مستعار LISP از Lost In Stupid Parenthese و یا Lost of Irritating Supper fluous parenthese گرفته شده‌است . هرچند ترکیب عبارت‌های نمادین مسئولی برای توان لیسپ است ، این ترکیب به شدت با قاعده و منظم است.
    هرچند ترکیبات لیسپ به نمادگذاری قدیمی محدود نشده‌اند می‌تواند به سبک‌های دیگر توسعه پیدا کند. تکیه روی عبارت‌ها ، قابلیت انعطاف پذیری زیادی به زبان می‌دهد ، زیرا توابع لیسپ به صورت لیست نوشته شده‌اند ، آنها دقیقا مانند داده‌ها می‌توانند پردازش شوند، این قابلیت اجازه می‌دهد برنامه‌های لیسپ به سادگی و راحتی نوشته شوند و به نسبت برنامه‌های دیگر به راحتی اداره شوند . (برنامه نویسی غیر نمادین)بسیاری از نسخه‌های زبان لیسپ با عناصر جدا شده توسط فاصله‌های سفید و پرانتزگذاری شده‌ها نوشته می‌شود. برای مثال (1 2 f00 ) یک لیست است که عنصرهای آن سه اتم هستند ( اتم: کوچکترین عضو لیست ) : این مقادیر 1 و 2 و F00 هستند. این مقادیر ضمنا دارای نوع داده‌ای خاصی هستند ، مثلا این لیست دارای دو عدد صحیح 1 و 2 و یک نوع دادهٔ ویژهٔ لیسپ که یک Symbol یا نماد نامیده می‌شود.
    همچنین یک لیست خالی () به عنوان یک اتم ویژهٔ صفر و یا پوچ معرفی شده‌است. موجودیت یک لیسپ از اتم و لیست تشکیل می‌شود. عبات‌ها به عنوان لیست نوشته شده‌اند ، استفاده کردن از ثبت‌های پیشوندی ، عناصر ابتدایی در لیست نامی از یک شکل تابع ، عملگرها ، ماکروها و یا اپراتورهای ویژه‌است.
    آرگومان‌ها باقیمانده‌هایی از لیست‌ها هستند ، برای مثال تابع list آرگومان‌ها را به عنوان یک لیست بر می‌گرداند ، بنابراین عبارت (list ‘1 ‘2 ‘foo) ارزیابی می‌شود و حاصل این ارزیابی لیست (1,2,foo) می‌باشد.
    نیازی به ارزیابی کردن اعداد نیست چون ارزیابی عدد 1 عدد 1 می‌شود.آرگومان‌های مثال قبل از اعداد هستند یعنی آرگومان‌های ویژه که این آرگومان‌ها از ارزیابی کردن آرگومان‌ها جلوگیری می‌کنند چون مقادیر آن‌ها مشخص است.هر عبارتی که بیان می‌شود قبل از اینکه با عبارات دیگر پیوست داده شود به صورت بازگشتی ارزیابی می‌شود.
    (list(1 2 (list(3 4)))) در این مثال حاصل اررزیابی به صورت لیست (1,2(3,4)) می‌باشد ،توجه کنید این لیست دارای 3 آرگومان می‌باشد ، لیست‌ها می‌توانند به صورت تو در تو باشند . اپراتورهای حسابگر به صورت همسان رفتار می‌کنند.
    حاصل عبارت (+1 2 3 4 ) عدد 10 می‌باشد. عبارت معادل عبارت بالا به صورت 1+2+3+4 می‌باشد که از نشانگذاری میان وندی استفاد شده‌است. اپراتورهای حسابگر در زبان لیسپ variadic(n-ary) که زبان لیسپ توانایی پذیرفتن هر تعداد آرگومان را داراست.
    عملگرهای ویژه ساختمان کنترل لیسپ را آماده می‌کنند. برای مثال ، اپراتور ویژه if سه آرگومان می‌پذیرد،اگر اولین آرگومان صفر و یا خالی باشد دومین آرگومان ارزیابی می‌شود و در غیر این صورت هٔرگومان سوم بررسی می‌شود . بنابر این if(nill(list 1 2 “foo”)(list 3 4 “bar”) که تنها آرگومان (list 3 4 “bar”) بررسی می‌شود.
    عبارت‌های لاندا(Lambda) :
    دیگر عبارت‌های ویژه لاندا می‌باشد که برای وصل کردن متغیرها به مقادیرشان که درون یک عبارت ارزیابی می‌شوند استفاده می‌شود. این عملگر همچنین برای ایجاد کردن توابع هم استفاده می‌شود. آرگومان‌های درون لاندا یک لیستی از آرگومان‌ها هستند و عبارت ارزیابی توابع می‌باشند. مقادیر بازگشتی مقادیری از عبارت قبلی که ارزیابی شده‌اند هستند.
    عبارت (Lambda(arg)(+arg1)) زمانی که این تابع به کار برده می‌شود به صورت یک تابع ارزیابی می‌شود و وظیفهٔ این تابع معرفی کردن یک آرگومان و اتصال دادن آرگومان به arg و در نهایت برگرداندن یک عدد بزرگتر از آرگومان قبلی می‌باشد عبارت‌های لاندا خیلی متفاوت با نام تابع رفتار نمی‌کند بنابراین اگر در عبارت (Lambda(arg)(+arg1))5->6 عدد 5 را وارد کنیم خروجی آن 6 می‌شود. اتم‌ها : در نسخهٔ اصلی لیسپ دو نوع دادهٔ ابتدایی وجود دارد: اتم‌ها و لیست‌ها یک لیست یک رشتهٔ منظم و محدودی از عناصر می‌باشد ، که هر عنصر در درون خودش یکی از این اتم‌ها و یا لیست‌ها را دارد و یک اتم یک عدد یا یک نماد می‌باشد.
    در اصل یک نماد یک رقم منحصر به فرد می‌باشدو به عنوان یک رشتهٔ عددی در سورس کد نوشته شده و هر دو به عنوان یک نام متغیر و یک رقم داده‌ای در پردازش نمادین استفاده می‌شود برای مثال list(foo(BAR 1)2) شامل سه عنصر : Symbol foo و list(BAR 1) و عدد 2 می‌باشد. تفاوت اصلی بین اتم‌ها و لیست‌ها این است که اتم‌ها تغییر ناپذیر و منحصر به فرد می‌باشند. دو اتم که دقیقا به یک صورت و به یک روش در یک شی نوشته شده باشد در مکان متفاوتی در سورس کد ظاهر می‌شوند، هر لیست یک شی مجزا می‌باشد و به خاطر اینکه مستقل از دیگر لیست هاست و از دیگر لیست‌ها به وسیلهٔ مقایسهٔ عملگرها مشخص می‌شود.
    Cons‌ها و لیست‌ها:
    یک لیست لیسپ یک لینک لیست جداست، هر ذره از این لیست یک Cons نامیده می‌شود و از دو اشاره گر که Car و Cdr نامیده می‌شوند ترکیب شده‌است این دو اشاره گر به ترتیب معادل دو فیلد Data و Next در مقالهٔ لینک لیست می‌باشد.
    Car -> Data Cdr -> Next
    بسیاری از ساختمان داده‌ها می‌توانند ترکیب‌هایی از خانه‌های Cons را داشت باشند ، یکی از این ساختمان داده‌های ابتدایی لیست مخصوص نامیده می‌شود ، یک لیست مخصوص هر دو نماد لیست خالی nill و یا خانه‌ها Cons را داراستکه در هر یک از این خانه‌ها هر اشاره گر Car به یک داده اشاره می‌کند (که ممکن است این اشاره گر Cons به یک لیست اشاره کند) و یک اشاره گر Cdr به یک لیست مخصوص دیگر اشاره می‌کند. اگر یک Cons داده به سر یک لینک لیست برده شود سپس اشاره گر Car آن به اولین عنصر از لیست و اشاره گر Cdr آن به انتهای یک لیست اشاره می‌کند به همین دلیل عملکرد Car و Cdr را به ترتیب first و rest هم نامیده می‌شود.
    ارایهٔ لیست عبارت نمادین:
    نمایش پرانتزگذلری عبارت نمادین ساختمان لینک لیست . چندین راه برای نمایش لیست یکسان به عنوان یک عبارت نمادین وجود دارد . یک خانه (Cons ) می‌تواند به صورت نشان گذاری جفت نقطه گذاری شده نوشته شود به عنوان مثال (a.b) که در آن a یک Car و b یک Cdr است. یک لیست مخصوص بلند ممکن است به صورت یک نشان گذاری جفت نقطه گذاری شده نوشته شود .(a.(b.(c.(d.nill))))
    طبق قرارداد کوتاه شدهٔ عبارت بالا به صورت (a b c d ) در نمادسازی لیست می‌باشد یک لیست مخصوص ممکن است در یک ترکیبی از دو صورت (a b c.d) نوشته شود . برای سیستمی از سه Cons که آخرین Cdr آن d است.
    دستورالعمل‌های پردازش لیست:
    لیسپ دستورالعمل‌های زیادی را برای دستیابی و کنترل لیست‌ها فراهم می‌کند . لیست‌ها می‌توانند مستقیما با پردازهٔ لیست ایجاد شوند .لیست هر تعدادی از آرگومان‌ها را می‌پذیرد و تعدادی از آرگومان‌ها را بر می‌گرداند.
    (list 1 2 ‘a 3 ); Output : (1 2 a 3 ) (list 1 ‘(2 3) 4 ); Output : (1 (2 3) 4)
    به این دلیل راهی که لیست‌ها ایجادمی شوند از جفت‌های Cons (Car,Cdr) پردازهٔ Cons می‌تواند برای اضافه کردن یک عنصر به جلوی یک لیست استفاده شود. توجه کنید که پردازهٔ Cons در هدایت و به کار بردن آرگومان‌های لیست نامتقارن است ، بدین دلیل روش‌های لیست‌ها ایجاد می‌شوند.
    (Cons 1 ‘(2 3)); Output: (1 2 3 ) (Cons ’(1 2) ‘(3 4)) Output : ((1 2) 3 4)
    پردازهٔ Oppend دو یا چند لیست را با هم ادغام می‌کند و یک لیست واحد ایجاد می‌کند زیرا لیست لیسپ یک لینک لیست است و پیچیدگی زمانی الحاق کردن لیست‌ها از مرتبهٔ پیچیدگی زمانی O(n) می‌باشد.
    ساختار اشتراکی: لیست‌های لیسپ لینک لیست‌های ساده می‌توانند با یکی دیگر از لیست‌ها در ساختمان مشترک باشند به عبارت دیگر دو لیست می‌توانند دم یکسانی داشته باشندیا رشتهٔ پایانی از
    Cons‌های یکسانی داشته باشند مثلا:
    (setf foo (list 'a 'b 'c)) (setf bar (cons 'x (cdr foo)))
    لیست foo و bar به ترتیب به صورت (a b c) و (X b c ) هستند هرچند دم (b c ) در هر دو لیست ساختار یکسانی دارند ولی مانند هم نیستند، خانه‌های Cons اشاره گر به b و c در محل حافظهٔ یکسانی برای هردو لیست قرار دارد.
    ساختار اشتراکی سریع تر از کپی کردن می‌تواند به صورت چشمگیری کارایی را بهبود بخشند. هرچند ، این مهارت می‌تواند متقابلا در راه‌های نامطلوب با عملکردهایی که تغییرات لیست‌های گذشته روی آرگومان‌های آن تاثیر بگذارد ، اثر کند.
    تغییرات یک لیست از قبیل تغییر دادن C با یک goose روی دیگری نیز تاثیر می‌گذارد setf (third foo) 'goose) که این تغییر نتیجه را به صورت (a b goose) تغییر می‌دهد اما bar هم تغییر می‌کند (X b goose) که ممکن است یک نتیجهٔ غیر منتظره باشد.
    زبان‌های برنامه نویسی Lisp معمولا از یک خط دستور محاوره‌ای استفاده می‌کنند،که می‌تواند با یک محیط پیچیدهٔ گسترش یافته ترکیب شود.کاربر اصطلاحات و دستورات را در خط دستور وارد کرده یا با رهبری IDE آنها را به سیستم Lisp می‌فرستد. Lisp دستورات را می‌خواند ، آن‌ها را ارزیابی می‌کند و نتایج را چاپ می‌کند. به این دلیل است که خط دستور زبان Lisp به حلقهٔ Read-Eval-Print یا REPL معروف است.
    نمونهٔ ساده‌ای از عملیات REPL در زیر آمده‌است. این یک شرح ساده‌است که بسیاری از المان‌های Lispواقعی در آن نمی‌آید مانند ماکروها و کوئت‌ها.
    تابع read جملات متنی را به عنوان ورودی می‌پذیرد و آنها را به ساختار لیست تجزیه می‌کند. به عنوان مثال ، وقتی شما رشتهٔ (+ 1 2) را در اعلان تایپ می‌کنید، تابع read آن را به یک لیست پیوندی حاصل از 3 المان ترجمه می‌کند: علامت + ، عدد 1 و عدد 2 . خیلی اتفاق می‌افتد که لیست قسمت موثری از یک کد Lisp باشد که قابل ارزیابی است.به همین دلیل است که یک قطار از لیست به یک تابع نام عملگر مع می‌دهد.
    تابع eval ساختار لیست را ارزیابی می‌کند و نوعی دیگر از ساختار را به عنوان نتیجه باز می‌گرداند.ارزیابی کردن لزوما تفسیر کردن معنی نمی‌دهد؛ بعضی سیستم‌های Lisp هر عبارتی را به زبان ماشین تبدیل می‌کنند. خیلی ساده است؛ به هر حال؛ برای تعریف ارزیابی به عنوان تفسیر : برای ارزیابی یک لیست که نام تابع دارد ، eval ابتدا تمام آرگومان‌های داده شده به cdr اش را ارزیابی می‌کند و سپس تابع را روی آن آرگومان‌ها اعمال می‌کند.در این مثال ، تابع عمل جمع است و به آرگومان‌های (1 2) اعمال می‌شود که نتیجه 3 است.این نتیجهٔ ارزیابی است.
    این وظیفهٔ تابع print است که نتیجه را به کاربر نمایش دهد. برای نتیجهٔ سادهٔ 3 این کار ناقابل است. یک عبارت که با قسمتی از ساختار لیست ارزیابی می‌شود میاز دارد که print لیست را به حرکت در آورد و در خروجی به شکل یک عبارت S نمایش دهد.
    برای اجرا کردن یک REPL در Lisp ، تنها لازم است که این سه تابع را اجرا کنید و یک تابع حلقه بی نهایت را.(به طور طبیعی اجرای eval پس از اجرای عملگرهای ویژه‌ای مانند if پیچیده خواهد شد.)یک REPL ساده به خودی خود با یک خط کد انجام شد: (loop(print(eval(red))))
    لیست در اصل تعداد کمی ساختار کنترلی دارد. منتها در تکامل و گسترش زبان تعداد زیادی به آن اضافه شدند.(عملگر اصلی شرایط در زبان Lisp که cond بود بعدا متشکل شد از ساختار if-then-else )
    برنامه نویسان در نسخهٔ Scheme حلقه‌ها را به صورت بازگشت دم( tail recursion ) بیان می‌کنند. موسسات متعارف علوم کامپیوتر Scheme بعضی دانشجویان را متعاقد می‌کند که تنها راه تکرار در زبان Lisp استفاده از بازگشت دم است؛ این اشتباه است. تمامی نسخه‌های متداول دیده شده از Lisp دارای ساختارهای الزامی برای تکرار هستند.درScheme دستور do به عنوان دستور حلقه پیچیدهٔ Lisp است. علاوه بر این مسالهٔ اصلی که شی گرایی را مهمتر از مسالهٔ فاعلی کرده این است که Scheme نیازهای ویژه‌ای برای کارکردن با فراخوانی دم(tail calls )دارد، در نتیجه دلیل ترغیب Scheme به استفاده از بازگشت دم این است که روش صراحتا با تعریف خود زبان پشتیبانی می‌شود . در مقابل ، ANSI Common Lisp نیازی به بهینه سازی که معمولا به حذف فراخوانی دم گفته می‌شود ندارد. در نتیجه این حقیقت که بازگشت دم به عنوان یک جایگزین تصادفی برای استفاده از ساختارهای مبتنی بر تکرار ( مانند do dolist loop ) توصیه نمی‌شود تنها یک مسالهٔ برتری ادبی نیست ، ولی بالقوه یکی از کارآمدهاست ( بعد از این که این روش فقط به عنوان یک پرش ساده به کار نرفت) و به عنوان یک تصحیح برنامه‌است .
    بعضی از ساختارهای کنترلی Lisp عملگرهای ویژه‌ای هستند ، هم ارز کلیدواژه‌های ترکیبی باقی زبان‌ها. عباراتی که این عملگرها استفاده می‌کنند ظاهری شبیه فراخوانی تابع دارد، تفاوت اینجاست که آرگومان‌ها ضرورتا نباید ارزیابی شوند یا در مورد تکرار شاید بارها ارزیابی شوند. در مقابل اکثر زبان‌های برنامه نویسی ، Lisp به برنامه نویسان اجازه می‌دهد با خود زبان ساختاهای کنترلی را پیاده سازی کنند.ساختارهای کنترلی زیادی در ماکروهای Lisp پیاده سازی می‌شوند و برنامه نویسان می‌توانند هر ماکرو را گسترش دهند ،برای آنانی که می‌خواهند بدانند چطور کار می‌کند.
    هر دوی Lisp Commonو Scheme دارای عملگرهای کنترلی غیر محلی هستند.تفاوت این عملگرها یکی از عمیق ترین تفاوت‌ها مابین این دو نسخهٔ زبان است. Scheme از ورودی مستمر با استفاده از روش call/cc پشتیبانی می‌کند ، که به برنامه اجازهٔ ذخیره ( و بعدا بازیابی کردن) یک عملیات ویژه را می‌دهد . Common Lisp از ورودی مستمر پشتیبانی نمی‌کند ولی از راه‌های زیادی برای انجام رهایی از تکرار پشتیبانی می‌کند.

    منبع

    · Patrick Winston and Berthold Horn, Lisp, Addison Wesley; 3 edition (January 1, 1989), ISBN 0-201-08319-1

  11. #9
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    انقیادها زود رس یا دیررس- کنترل نوع ایستا یا پویا- تبدیل نوع ضمنی یا صریح


    لیسپ دارای انقیاد دیررس می باشد زیرا قابلیت انعطاف موضوعی در پیاده سازی مهم است اغلب انقیاد ها در زمان اجرا صورت می گیرد.

    کنترل نوع یعنی این که هر عملیاتی که در برنامه انجام می گیرد تعداد و نوع آرگومان های آن درست باشد. لیسپ کنترل نوع پویا دارد یعنی کنترل نوع آن در زمان اجرا انجام میشود.
    لیسپ دارای تبدیل نوع ضمنی است زیرا دارای کنترل نوع پویاست و کنترل نوع پویا در نقطه ای از زمان اجرا که عدم تطابق به علت وجود انواع داده ای متنوعی که دارد رخ می دهد تبدیل ضمنی صورت می گیرد.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

  12. #10
    دوست آشنا
    رشته تحصیلی
    کامپیوتر
    نوشته ها
    1,151
    ارسال تشکر
    3,303
    دریافت تشکر: 2,587
    قدرت امتیاز دهی
    38
    Array
    بانوثریا's: جدید117

    پیش فرض پاسخ : طراحی و پیاده سازی زبانهای برنامه سازی :بررسی زبان لیسپ

    انواع داده های اولیه-نحوه تعریف یک متغییر از نوع آنها- پیاده سازی سخت افزاری یا نرم افزاری- انواع عملیات بر روی این انواع


    اشیای داده اولیه در لیسپ عبارتند از : اتم و لیست. تعریف تابع و لیست های خاصیت انواع خاصی از لیست ها هستند که اهمیت ویژه ای دارند.آرایه ها،اعداد و رشته ها نیز وجود دارند ولی نقش چندانی ندارند.

    متغییرها و ثوابت. اتم لیسپ نوع اولیه شی داده است. اتم را گاهی اتم لیترال نیز می نامند تا از عدد یا اتم عددی تفکیک شود از نظر نحوی اتم مثل شناسه، رشته ای از حروف و ارقام است که با حرف شروع می شود. تفاوتی بین حروف کوچک و بزرگ در نامگذاری شناسه نیست . در تعریف تابع ، اتمها مثل شناسه ها رفتار می کنند، یعنی به عنوان اسامی متغییرها،توابع،پارامتر مجازی و غیره به کار می روند.
    اما اتم در زمان اجرا مثل شناسه نیست. اتم ، شی داده پیچیده ای است که در حافظه نمایش داده می شود و حافظه توصیفگر نوع و اشاره گری به لیست خاصیت است. لیست خاصیت شامل خواص گوناگون مربوط به اتم است که یکی از آنها نام چاپی آن است که یک رشته کاراکتری نمایش دهنده اتم برای ورودی خروجی است. سایر خواص،انقیادهای گوناگونی را برای اتم نمایش می دهند که ممکن است شامل نام تابع و سایر خواصی باشد که توسط برنامه در حال اجرا تعیین می شود.
    وقتی اتمی به عنوان عنصری از شی داده دیگر مثل لیست باشد به وسیله اشاره گر به محلی از حافظه نمایش داده می شود که به عنوان نمایش زمان اجرای اتم عمل می کند. لذا هر مراجعه به اتمABC در حین اجرای برنامه لیسپ به صورت اشاره گر به همان محل حافظه منظور می شود.
    هر اتم به عنوان عنصری در جدول مرکزی تعریفی سیستم،به نام لیست شی(ob-list)قرار می گیرد .ob_list به صورت جدول در هم سازی سازمان دهی می شود که نام چاپی را به طور کارآمد جستجو می کند و بازیابی اشاره گر به اتمی با آن نام چاپی را آسان می کند. به عنوان مثال وقتی لیستی ورودی است که حاوی رشته کاراکتری"ABC" است که نشان دهنده اتم ABC است. تابع readلیستob_list را برای"ABC" جستجو می کند که حاوی اشاره گر به حافظه اتم ABC است این اشاره گر در محل مناسبی از لیستی که ساخته می شود درج می گردد.
    اعداد به شکل صحیح یا ممیز شناور قابل استفاده اند.از نمایش سخت افزاری استفاده می شود ولی نیاز به توصیفگر زمان اجراست. لذا هر عدد دو کلمه را اشغال می کند. این نمایش بخوبی با نمایشی که برای اتمهای لیترال به کار می رود تنظیم می شود. هر عدد یک اتم با تعیین کننده نوع و اشاره گری به رشته بیتی نمایش دهنده عدد است.
    رته ها به صورت رشته هایی از نمادها نمایش داده می شود. کتیشن یگانه به عنوان تابع quote برای آرگومان های لیترال به توابع تفسیر می شود.
    عقاب همیشه تنهاست...اما لاشخورها همیشه با هم اند
    فعالیتم رو در این سایت متوقف کردم... موفق باشید

صفحه 1 از 2 12 آخرینآخرین

اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. مقاله: سیستم عامل ( مقاله )
    توسط Admin در انجمن بخش مقالات نرم افزار
    پاسخ ها: 9
    آخرين نوشته: 25th April 2013, 01:33 AM
  2. آموزش زبان c
    توسط آبجی در انجمن برنامه نویسی تحت سیستم عامل
    پاسخ ها: 31
    آخرين نوشته: 19th April 2011, 12:55 AM
  3. سنجش موفقيت برنامه ريزي فناوري اطلاعات
    توسط engeneer_19 در انجمن مباحث فناوری اطلاعات
    پاسخ ها: 0
    آخرين نوشته: 26th July 2009, 08:33 PM
  4. آموزشی: ژنتیک و شبیه سازی
    توسط Mina_Mehr در انجمن ژنتیک
    پاسخ ها: 0
    آخرين نوشته: 18th May 2009, 01:05 AM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •