Common Lisp

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Common Lisp
Տեսակծրագրավորման լեզու, ծրագրավորման պրոցեդուրային լեզու, օբյեկտ կողմնորոշված ծրագրավորման լեզու, ֆունկցիոնալ ծրագրավորման լեզու և բազմահարացուցային ծրագրավորման լեզու
Առաջացել է1984
ՍտեղծողX3J13?
ՆախագծողՍքոթ Ֆալման, Richard P. Gabriel? և David Moon?
Հիմքի վրա էInterlisp?[1] և Maclisp?[1]
Ներշնչվել էԼիսպ, Lisp Machine Lisp?, Maclisp?, Scheme և Interlisp?
Կայքcommon-lisp.net(անգլ.)
 Common Lisp Վիքիպահեստում

Common Lisp (CL), բազմանպատակ ծրագրավորման լեզու, որը հնարավորություն է տալիս ծրագրավորել պրոցեդուրային, ֆունկցիոնալ և օբյեկտներին կողմնորոշված մոտեցումներով։ Մշակվել և ստանդարտացվել է ANSI X3J13 կոմիտեի կողմից։ Common Lisp-ը տիպերի դինամիկ ստուգմամբ խիստ տիպիզացված լեզու է։

Ֆունկցիաներ[խմբագրել | խմբագրել կոդը]

Հանդիսանալով 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» է)։

Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]