Common Lisp

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

## Ֆունկցիաներ
Հանդիսանալով Lisp ծրագրավորման լեզվի դիալեկտ՝ Common Lisp լեզվում նույնպես ծրագրերի ու տվյալների ներկայացման համար օգտագործում են S-արտահայտությունները (S-expressions)։ Ֆունկցիաների, մակրոսների ու հատուկ կառուցվածքների կիրառությունները ներկայացվում են որպես «(» և «)» փակագծերի մեջ առնված ցուցակներ։ Օրինակ, r շառավղով շրջանի մակերեսը հաշվող ֆուկցիայի սահմանումն ունի հետևյալ տեսքը․


```lisp
(defun area (r)
  (* pi r r))
```


որտեղ defun-ը նոր գլոբալ ֆունկցիա սահմանող մակրոսն է, իսկ «*»-ը՝ բազմապատկման ֆունկցիան։

### Անանուն ֆունկցիաներ
Անանուն ֆունկցիաները ստեղծվում են lambda մակրոսով։ lambda բառին հետևում են ֆունկցիայի արգումենտների ցուցակը և մարմինը ձևավորող արտահայտությունները։ Օրինակ, *a* և *b* կողերով ուղղանկյուն եռանկյան ներքնաձիգը հաշվող ֆունկցիան կարելի է սահմանել հետևյալ կերպ․


```lisp
(lambda (a b) (sqrt (* a a) (* b b)))
```


### Լոկալ ֆունկցիաներ
Ֆունկցիայի մարմնում լոկալ ֆունկցիան սահմանվում է `labels` և `flet` կառուցվածքներով։ `labels`-ի օգնությամբ սահմանված ֆունկցիաները տեսանելի են միմյանց համար և կարող են պարունակել ռեկուրսիա կամ փոխադարձ ռեկուրսիա։ `flet` կառուցվածքի օգնությամբ սահմանված լոկալ ֆունկցիաները իրարից անկախ են։

## Հաստատուններ և փոփոխականներ
Դինամիկ փոփոխականները սահամնվում են `defvar` և `defparameter` մակրոսներով, իսկ հաստատունները՝ `defconstant` մակրոսով։ Օրինակ, ստորև սահմանված են `*first-variable*`, `*second-variable*` դինամիկ փոփոխականները և `+one-constant+` հաստատունը․


```lisp
(defvar *first-variable* nil)
(defparameter *second-variable* 777)
(defconstant +one-constant+ "String literal")
```


ըստ ընդունված պայմանավորվածության Common Lisp ծրագրերում հայտարարված դինամիկ փոփոխականների անունները սկսվում և ավարտվում են «*» նիշով, իսկ հաստատունների անունները՝ «+» նիշով։

### Լոկալ փոփոխականներ
Լոկալ (լեքսիկական) փոփոխականները ստեղծվում են `let` և `let*` կառուցվածքների մարմնում։ Օրինակ, հետևյալ արտահայտության մեջ ստեղծված են `v0`, `v1`, `v2` և `v3` լոկալ փոփոխականները, որոնցից առաջին երեքին արժեք է տրված, իսկ չորրորդին՝ ոչ (վերինն ընդունում է `nil` արժեքը)։


```lisp
(let ((v0 1) 
      (v1 "abc")
      (v2 '(x y))
      v3)
#| ... |#
)
```


`let` կառուցվածքը և `let*` կառուցվածքից տարբերվում է նրանով, որ առաջինում փոփոխականներն արժեքներ վերագրումը կատարվում է զուգահեռաբար՝ միմյանցից անկախ, իրկ երկրորդ դեպքում՝ հաջորդաբար։ `let*` կառուցվածքի ամեն մի փոփոխականը կարող է օգտագործել իր նախորդի արժեքը։ Օրինակ,


```lisp
(let* ((v0 2) 
       (v1 (* v0 3))
       (v2 (+ v1 777))
#| ... |#
)
```


## Մակրոսներ
Common Lisp լեզվի մակրոսների մեխանիզմը լեզվի ընդլայնման հիմնական եղանակն է։ Այն հնարավորություն է տալիս լեզուն հարստացնել նոր գործողություններով։ Մակրոսները սահմանվում են `defmacro` մակրոսով։

## Ստրուկտուրաներ
Ստրուկտուրաները սահմանվում են defstruct մակրոսով։ Այդ մակրոսի առաջին արգումենտը ստրուկտուրայի անունն է, իսկ հաջորդները՝ դաշտերը (slots)։ Ստրուկտուրայի ամեն մի դաշտի համար կարելի է տալ լռելության արժեք, տիպ և նշել, որ տվյալ դաշտն առաջին անգամ արժեքավորվելուց հետո չի կարող փոխել արժեքը («read only» է)։

## Ծանոթագրություններ

Կատեգորիա:Օբյեկտ կողմնորոշված ծրագրավորման լեզուներ