استاندارد ام‌ال

از ویکی‌پدیا، دانشنامهٔ آزاد
.sml
پارادایم برنامه‌نویسیچندپارادایم: تابعی، استاتیک
.sml
.sml
وبگاه
پیاده‌سازی‌های بزرگ
MLKit, MLton, MLWorks, Moscow ML , Poly/ML , SML/NJ, MLj, SML.NET
گویش
Alice, Concurrent ML, Dependent ML
متأثر از
ML, Hope
تأثیر گذاشته بر
Elm, F*, OCaml, Rust, Scala

استاندارد ام‌ال (به انگلیسی: Standard ML) یا SML یک زبان برنامه‌نویسی همه منظوره مدولار، تابعی با بررسی همزمان هنگام کامپایل و تشخیص خودکار نوع متغیرها است. این زبان برنامه‌نویسی در میان نویسنده‌های کامپایلر و محققان زبان برنامه‌نویسی و در اثبات قضیه خودکار محبوبیت دارد.

زبان[ویرایش]

استاندارد ام‌ال یک زبان برنامه‌نویسی تابعی با برخی ویژگی‌های ناخالص است. برنامه‌های نوشته شده به زبان استاندارد ام‌ال شامل عبارت‌هایی برای ارزیابی هستند. بر خلاف دستورها برنامه‌نویسی معمول، برخی از عبارت‌ها یک مقدار واحد را بازمی‌گردانند. برخی از آن‌ها نیز تنها برای تأثیرهای جانبی ارزیابی می‌شوند.

مثل همه زبان‌های برنامه‌نویسی تابعی، توابع یک ویژگی کلیدی استاندارد ام‌ال هستند که برای انتزاع استفاده می‌شوند. برای مثال تابع فاکتوریل می‌تواند به صورت زیر بیان شود:

 fun factorial n =
        if n = 0 then 1 else n * factorial (n-1)

کامپایلر استاندارد ام‌ال نوع int -> int برای این تابع را بدون وارد کردن نوع متغیرها توسط کاربر باید تفسیر کند. به عبارت دیگر کامپایلر وظیفه دارد تا تفسیر کند که n تنها همراه با عبارات INT می‌تواند استفاده شود، بنابراین نوع n نیز باید از نوع INT بوده و همه مقادیر برگشتی از تابع فوق نیز از همین نوع باشند.

تابع فاکتوریل می‌تواند به صورت شروط اگر-آنگاه در قالب دنباله‌ای از توابع فاکتوریل که به صورت شکل قالب مانند بیان شده‌اند، نیز تعریف شود. این توابع با '|' از یکدیگر متمایز می‌شوند و به صورت چسبیده به یکدیگر تعریف می‌شوند.

 fun factorial 0 = 1
   | factorial n = n * factorial (n - 1)

که می‌تواند با استفاده از عبارات case نیز به صورت زیر بازنویسی شود:

 val rec factorial =
        fn n => case n of 0 => 1
                        | n => n * factorial (n - 1)

و یا با استفاده از تابع لامبدا:

 val rec factorial = fn 0 => 1 | n => n * factorial(n -1)

با استفاده از یک تابع محلی، تابع فاکتوریل می‌تواند به صورت بهینه‌تری بازنویسی شود:

 fun factorial n = let
      fun lp (0, acc) = acc
        | lp (m, acc) = lp (m-1, m*acc)
      in
        lp (n, 1)
      end

مابین عبارت let و in تابع lp تعریف می‌شود و هنگام فراخوانی تابع فاکتوریل (بین عبارت in و end) اجرا می‌شود.

جستارهای وابسته[ویرایش]

منابع[ویرایش]

ترجمهٔ ویکی‌پدیا انگلیسی