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

Ֆունկցիաներ խմբագրել

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

Ծանոթագրություններ խմբագրել