Common Lisp
Common Lisp (CL), բազմանպատակ ծրագրավորման լեզու, որը հնարավորություն է տալիս ծրագրավորել պրոցեդուրային, ֆունկցիոնալ և օբյեկտներին կողմնորոշված մոտեցումներով։ Մշակվել և ստանդարտացվել է ANSI X3J13 կոմիտեի կողմից։ Common Lisp-ը տիպերի դինամիկ ստուգմամբ խիստ տիպիզացված լեզու է։
![]() | |
Տեսակ | ծրագրավորման լեզու, ծրագրավորման պրոցեդուրային լեզու, օբյեկտ կողմնորոշված ծրագրավորման լեզու, ֆունկցիոնալ ծրագրավորման լեզու և բազմահարացուցային ծրագրավորման լեզու |
---|---|
Առաջացել է | 1984 |
Ստեղծող | X3J13? |
Նախագծող | Սքոթ Ֆալման, Richard P. Gabriel? և David Moon? |
Հիմքի վրա է | Interlisp?[1] և Maclisp?[1] |
Ներշնչվել է | Լիսպ, Lisp Machine Lisp?, Maclisp?, Scheme և Interlisp? |
Կայք | common-lisp.net(անգլ.) |
![]() |
Ֆունկցիաներ Խմբագրել
Հանդիսանալով Lisp ծրագրավորման լեզվի դիալեկտ՝ Common Lisp լեզվում նույնպես ծրագրերի ու տվյալների ներկայացման համար օգտագործում են S-արտահայտությունները (S-expressions)։ Ֆունկցիաների, մակրոսների ու հատուկ կառուցվածքների կիրառությունները ներկայացվում են որպես «(» և «)» փակագծերի մեջ առնված ցուցակներ։ Օրինակ, r շառավղով շրջանի մակերեսը հաշվող ֆուկցիայի սահմանումն ունի հետևյալ տեսքը․
(defun area (r)
(* pi r r))
որտեղ defun-ը նոր գլոբալ ֆունկցիա սահմանող մակրոսն է, իսկ «*»-ը՝ բազմապատկման ֆունկցիան։
Անանուն ֆունկցիաներ Խմբագրել
Անանուն ֆունկցիաները ստեղծվում են lambda մակրոսով։ lambda բառին հետևում են ֆունկցիայի արգումենտների ցուցակը և մարմինը ձևավորող արտահայտությունները։ Օրինակ, a և b կողերով ուղղանկյուն եռանկյան ներքնաձիգը հաշվող ֆունկցիան կարելի է սահմանել հետևյալ կերպ․
(lambda (a b) (sqrt (* a a) (* b b)))
Լոկալ ֆունկցիաներ Խմբագրել
Ֆունկցիայի մարմնում լոկալ ֆունկցիան սահմանվում է labels
և flet
կառուցվածքներով։ labels
-ի օգնությամբ սահմանված ֆունկցիաները տեսանելի են միմյանց համար և կարող են պարունակել ռեկուրսիա կամ փոխադարձ ռեկուրսիա։ flet
կառուցվածքի օգնությամբ սահմանված լոկալ ֆունկցիաները իրարից անկախ են։
Հաստատուններ և փոփոխականներ Խմբագրել
Դինամիկ փոփոխականները սահամնվում են defvar
և defparameter
մակրոսներով, իսկ հաստատունները՝ defconstant
մակրոսով։ Օրինակ, ստորև սահմանված են *first-variable*
, *second-variable*
դինամիկ փոփոխականները և +one-constant+
հաստատունը․
(defvar *first-variable* nil)
(defparameter *second-variable* 777)
(defconstant +one-constant+ "String literal")
ըստ ընդունված պայմանավորվածության Common Lisp ծրագրերում հայտարարված դինամիկ փոփոխականների անունները սկսվում և ավարտվում են «*» նիշով, իսկ հաստատունների անունները՝ «+» նիշով։
Լոկալ փոփոխականներ Խմբագրել
Լոկալ (լեքսիկական) փոփոխականները ստեղծվում են let
և let*
կառուցվածքների մարմնում։ Օրինակ, հետևյալ արտահայտության մեջ ստեղծված են v0
, v1
, v2
և v3
լոկալ փոփոխականները, որոնցից առաջին երեքին արժեք է տրված, իսկ չորրորդին՝ ոչ (վերինն ընդունում է nil
արժեքը)։
(let ((v0 1)
(v1 "abc")
(v2 '(x y))
v3)
#| ... |#
)
let
կառուցվածքը և let*
կառուցվածքից տարբերվում է նրանով, որ առաջինում փոփոխականներն արժեքներ վերագրումը կատարվում է զուգահեռաբար՝ միմյանցից անկախ, իրկ երկրորդ դեպքում՝ հաջորդաբար։ let*
կառուցվածքի ամեն մի փոփոխականը կարող է օգտագործել իր նախորդի արժեքը։ Օրինակ,
(let* ((v0 2)
(v1 (* v0 3))
(v2 (+ v1 777))
#| ... |#
)
Մակրոսներ Խմբագրել
Common Lisp լեզվի մակրոսների մեխանիզմը լեզվի ընդլայնման հիմնական եղանակն է։ Այն հնարավորություն է տալիս լեզուն հարստացնել նոր գործողություններով։ Մակրոսները սահմանվում են defmacro
մակրոսով։
Ստրուկտուրաներ Խմբագրել
Ստրուկտուրաները սահմանվում են defstruct մակրոսով։ Այդ մակրոսի առաջին արգումենտը ստրուկտուրայի անունն է, իսկ հաջորդները՝ դաշտերը (slots)։ Ստրուկտուրայի ամեն մի դաշտի համար կարելի է տալ լռելության արժեք, տիպ և նշել, որ տվյալ դաշտն առաջին անգամ արժեքավորվելուց հետո չի կարող փոխել արժեքը («read only» է)։