ot M.Petrov(16-06-2007)

reiting (19)   [ dobre ]  [ zle ]

Printer Friendly Variant za otpechatvane

Vuvedenie v Lisp/Scheme
Napisana ot M. Petrov(blagodarnosti na : http://www.dhstudio.eu)


Statiiata „Vuvedenite v Lisp/Scheme“ e napisana za potrebitelite na Gnu/Linux. Instalatsiiata na DrScheme pod Gnu/Linux (Debian 3.1/4.0) se izvurshva po sledniia nachin: apt-get install drscheme.

Lisp e razraboten ot Dzhon Makkarti prez 1958 g. dokato e bil v MIT (Massachusetts Institute of Technology). Lisp e baziran na Lambda- smiataneto vuvedeno ot Alonso CHurch prez 1930 godina. Imeto na Lisp proizhozhda ot "Lisp Processing".  Lisp ima dosta goliam broi dialekti kato nai- populiarni sa: Common Lisp i Scheme. Toi burzo stava edin ot nai- populiarnite programni ezitsi za izkustven intelekt. Nie shte razgledame dialekta Scheme koito e bil razraboten prez 1970 godina ot Gai Stiili i  Dzherard Dzhei Susman. Ezika Scheme ima dva definirani standarta: Ofitsialniia IEEE standart i standarta narechen Revisedn Report on the Algorithmic Language Scheme koito e abreviatura ot RnRS, kudeto n e nomer na reviziia. Segashniia standart e R5RS i R6RS e v protses na razrabotka. Prilozhenieto koeto shte polzvame v GNU/Linux shte bude: drscheme



1.0 Operatori i Operandi


Sustavna chast ot povecheto ezitsi sa negovite operatori i operandi. Osnovnite operatori sa: /, *, +, - .Neka razgledame sledniia primer za subirane na dve chisla izpolzvaiki operatori i operandi:

Primer 1.

> (+ 5 4)
9

Osnovnite operatori polzvat sledniia sintaksis:
(<operator> <operand1> <operand2> <operand N>)

Terminite operatori, protseduri i funktsii imat ednoznachno znachenie kakto i terminite argument i operand. Slozhnostta pri upotrebata na operatori mozhe da se uvelichi pri upotrebata na poveche ot edin operator v sustavianeto na konkreten izraz. Primer za izraz izpolzvasht poveche ot edin operator e sledniia:

Primer 2.

> (+ 5 (* 3 2))
11

Primer 3.

> (+ 5 (/ 14 2))
12

Primer 4.

> (+ (* 1 2) (- (+ 3 4) (/ 6 3)))
7

Neka razgledame podrobno deistvieto koeto izvurshva primer 2. Razgledaniia primer 2 kazva slednoto: suberi chisloto 5 s chisloto polucheno ot umnozhenieto na chislata 3 i 2 i izvedi polucheniia rezultat .
2.0 Identifikatori, Prazni mesta i Komentari

Identifikatorite sa posledovatelnost ot bukvi, chisla i slednite simvoli: ! $ % & * + - . / : < = > ? @ ^ _ ~
TSelta na praznite mesta e da napraviat koda po- lesen za chetene. Primer s izpolzvane na prazni mesta mozhe da vidite v sledniia Scheme izraz:

Primer 5.

> (* (+ 1 2 )
      (+ (- 13 3) ))
30

Komentarite sa edna fundamentalna chast vuv vseki programen ezik. Komentarite sushto blagopriiatstvat za po- goliamata chetlivost na koda. Izpolzvaneto na komentari predrazpolaga izpolzvaneto  i razrabotvaneto na koda ot vseki programist. Komentarite v Scheme se oznachavat sus ' ; '.  Vseki tekst razpolozhen ot ';' do kraia na reda se ignorira ot kompilatora. V Scheme niama komentari operirashti na poveche ot edin red.

3.Fundamentalni tipove

V Scheme ima devet tipa. Nie shte razgledame osnovnite: bulevi, chisla, nizove  i simvoli.

3.1 Bulev tip

Pri upotrebata na bulevi tipove e neobhodimo da se znae, che tozi tip izvezhda „istina“ ili „luzha“. Istinata pri izpolzvaneto na bulev tip se otbeliazva sus „#t“, a luzhata sus „#f“ . Neka sledvame izrechenata mudrost „Hiliadi dumi se ravniavat na edin pogled“ i razgledame slednite primeri:

Primer 6.

> (boolean? 3.14)
#f

> (number? 131)
#t
> (boolean? #t)
#f

> (boolean? #f)
#t

Razlichni bulevi operatori vklyuchvat i, ili i ne:

Primer 7.

> (and #f #t)
#f
> (or #f #t)
#t
> (and (not #f) (or #f #t))
#t

3.2 CHisla

CHislovite tipove imat niakolko podtipa kato: number, complex, real, rational, i integer. Za da razberete tochnostta na konkretno chislo mozhe da polzvate : exact?“ ili „inexact?“. Neka razgledame slednite primeri:

Primer 8.

> (/ 4 7)
4/7
> (number? (/ 4 7))
#t
> (rational? (/ 4 7))
#t
> (integer? (/ 4 7))
#f
> (exact? (/ 4 7))
#t
> (inexact? (/ 4 7))
#f
> (sqrt (/ 4 7))
0.7559289460184545
> (exact? (sqrt (/ 4 7)))
#f
> (inexact? (sqrt (/ 4 7)))
#t


3.3 Nizove

Niz e razpolozheniia tekst mezhdu dvoini kavichki „“. V nizovete e vuzmozhna upotrebata na spetsialni simvoli blagodarenie na „\“ . Mnogo chesto izpolzvani sa nizovete i funktsiite operirashti s tiah. CHesto sreshtani niz funktsii sa: substring, string-ref.

Primer 9.

> (substring "www.dhstudio.eu" 4 15)
"dhstudio.eu"
> (substring "testing" 4 7)
"ing"
> (substring "www.dhstudio.eu" 4)
"dhstudio.eu"
> (string-ref "testing" 3)
#\t

3.4 Simvoli

Upotrebata na simvoli uvelichava razmera na strukturite danni koito ezika obrabotva. Za rabota sus simvoli se upotrebiava predikata eq? izvesten sushto kato predikat za identichnost. Definitsiiata za identichnost na dva simvola glasi, che dvata simvola triabva da se sustoiat ot edni i sushti znatsi zapisani v edin i susht red. Neka razgledame sintaksisa na predikata eq ?

Primer 10.

> (eq? m1 m2)

Semantikata na predikata eq? se bazira na istina i luzha t.e. ako: simvolnite izrazi m1 i m2 sa otseneni kato edni i sushi izrazi to rezultata e #t (true/istina) dokato v protiven sluchai e #f (false/luzha). CHesto sreshtan e predikata symbol? , koito ima za tsel da otseni konkreten obekt i da izvede #t (true/luzha) , ako obekta e simvol i obratnoto. Primera po- dolu ilyustrira deistvieto na predikata symbol?


Primer 11.

> (symbol? 10)
#f
> (symbol? 'martin)
#t

4.0 Promenlivi

Deklarirane na globalni promenlivi se izvurshva s operatora define. Stoinostta na promenlivata po- rano ukazana s operatora define mozhe da bude promeniana s operatora set! . Sledniia primer izobraziava izkazanoto do momenta.

Primer 12.

> (define sbor 26)
> (set! Sbor (+ 20 5))
> sbor
25


5.0 Spisutsi

CHislata, nizovete, simvolite i bulevite konstanti (#t | #f) se narichat sushto atomi. Osnovna konstruktsiia na lispo- podobnite funktsionalni ezitsi e S- izrazut. S- izrazut se naricha tochkova dvoika ili samo dvoika.
Definitsiia za S- izraz:

1.> Vseki atom e S- izraz
2.> Ako A i B sa S- izrazi, to (A.B) e S- izraz
3.> S- Izraz se opredelia samo po pravilata 1> i 2>

CHrez tochkova dvoika se „slepvat“ dva obekta i se konstruira sustaven obekt. Grafichno izobrazeno slepvane na dva obekta izglezhda po sledniia nachin:

          *****************************
          * purvi obekt * vtori obekt *
          *****************************

Liavata chast na kletkata sudurzha purviia obekt, a diasnata chast vtoriia obekt. Neka razgledame primer za dvoikata (9 . 8)

Primer 13.

          *************
          *    9     *   8    *
          *************

Neka razgleda malko po- uslozhnen primer na dvoikata ((2.3).(4.5))

Primer 14.

 *************         *************        *************
 *    2     *    3   *   ->  *     <-  * ->     *  <-  *  4    *    5       *
 *************         *************        *************

Definirane na spisuk v Scheme se izvurshva sus primitivnata protsedura list. Primer za definirane na spisuk:

Primer 15.

> (define dhstudio.eu ( list 'm 'a 'r 't 'i 'n) )
> dhstudio.eu
(m a r t i n)

Vuv vseki lispo- podoben ezik sa vgradeni sredstva za realizirane na dvoiki i rabota s tiah. V Scheme tezi sredstva sa fundamentalnite protseduri cons, car i cdr.


5.1 Protsedura cons

Protsedurata cons e sukrashtenie ot construct ili konstruktor na dvoiki. Konstruktora ima sravnitelno lesen sintaksis ot vida: (cons b2 c3), kudeto cons e izpolzvanata protsedura, a b2, c3 sa izrazi chiito otsenki sa S-izrazi, t.e. atomi ili tochkovi dvoiki. Semantikata na protsedura cons se nablyudava v sledvashtiia razgledan primer koito konstruira dvoiki:

Primer 16.

> (define b1 10)
> (define c2 20)
> (cons b1 c2)
(10 . 20)

5.2 Protsedura car

Ideiata na protsedurata car e da nameri purviia obekt na dvoika ili spisuk. Semantikata i sintaksis na razglezhdanata protsedura car nai- lesno se obiasniava sus sledniia primer koito izvezhda purvi element ot spisuk:

Primer 17.

> (define testlist (list 0 1 2 3 4 5 6 7 8 9 ))
> (car testlist)
0

Predhodniia primer izobraziava izvezhdane purvi chlen na spisuk.

Primer 18.

> (define a 10) (define b 20)
>  (define c (cons a b) )
>   (car c)
20


Predhodniia primer izvezhda purviia obekt na dvoika.

5.3 Protsedura cdr

Protsedurata cdr e retsiprochna na car, t.e. neinata ideia e da izvede vtoriia obekt ot spisuk ili dvoika. Semantikata i sintaksisa e analogichen na protsedurata car. Sledniia primer izobraziava deistvieto na protsedurata cdr:

Primer 19.

(define a 10) (define b 20)
(define c (cons a b) )
(cdr c)

5.4 Protsedura append

Deistvieto koeto izvurshva tekushtata protsedura append e konkatenatsiia na spisutsi. Konkatenatsiia na spisutsi mozhe da nablyudavame v sledniia primer:

Primer 20.

> (define a(list 1 2 3 )) (define b(list 4 5 6 ) )
> (append a b)
(1 2 3 4 5 6)

5.5 Protsedura reverse

Protsedurata reverse (obrushtane) obrushta elementite na spisuk. Neka razgledame sledniia primer za protsedurata reverse:

Primer 21.

> (define a(list 1 2 3 ))
> (reverse a)
(3 2 1)

6.0 Fundamentalni kontrolni strukturi


6.1 Kontrolna struktura cond (short for conditional)

Strukturata cond ima za tsel da otseni konkreten izraz i da vurne rezultat (istina | luzha ). Sintaksisa na strukturata cond e sledniia:

(cond
 (<condition1> <expression1>)
 (<condition2> <expression2>)
 ...
 (else <expressionN>))
Sledniia primer onaglediava tselta na kontrolnata struktura cond.

Primer 22.

> (define (abs1 x)
>   (cond ((> x 0) x)
>     ((= x 0) 0)
>     (else (- 0 x)) ))


6.2 Protsedura „case“

Protsedura „case“ e podobna na switch pri C/C++/Java. Protsedurata definira predvaritelno konkreten broi varianti koito mogat da budat izbirani. Sintaksisa i semantikata na protsedura „case“ mozhe da nablyudavame vuv sledniia primer:

Primer 23.

define get-type
 (lambda (data)
   (case data
     ((0 1 2 3 4 5 6 7 8 9) 'digit)
     ((#\A #\E #\I #\O #\U #\Y #\a #\e #\i #\o #\u #\y) 'vowel)
     (else
      (if (and (char? data) (char-alphabetic? data))
          'consonant
          'other)))))
> (get-type "Hawaii")
other
> (get-type 5)
digit
> (get-type #\o)
vowel
> (get-type #\s)
consonant    
6.3 Protsedura „or“
Scheme protsedurata „or“ se obiasniava dosta dobre v sledniia primer:
Primer 24.
> (or #f #f #f #f)
#f
> (or #f 42 #f)
42
> (or #t #f)
#t
6.4 Protsedura „and“
Scheme protsedurata „and“ se obiasniava dosta dobre v sledniia primer:
Primer 25.
> (and #t #t #t #t)
#t
> (and #t 3.14 'squirrel)
squirrel
> (and 'false '() #f 'only-the-#f-is-false)
#f
> (and 'false '() 'only-the-#f-is-false)
only-the-#f-is-false
6.5 Protsedura if
Protsedurata if e podobna na protsedurata cond. Scheme protsedurata „if“ se obiasniava dosta dobre v sledniia primer:
Primer 26.
(define (chislo num)
> ( cond
>    ((> num 0) "Polojitelno")
>    ((< num 0) "Otricatelno")
>    ((= num 0) "Rawno na 0")
>    (else "zero")))
> (chislo 10)
"Polojitelno"
> (chislo 0)
"Rawno na 0"
> (chislo -1)
"Otricatelno"

Scheme e dosta interesen i zabaven dialekt na Lisp uspiavasht da ni zaintriguva sus svoiata krasota i iasno. Scheme si ostava napulno podhodiasht ezik za uchebni tseli, no sushto taka namira i drugi prilozheniia.

SUDURZHANIE

1.0 Operatori i Operandi
2.0 Identifikatori, Prazni mesta i Komentari
3.0 Fundamentalni tipove
3.1 Bulev tip
3.2 CHisla
3.3 Nizove
3.4 Simvoli
4.0 Promenlivi.
5.0 Spisutsi
5.1 Protsedura cons
5.2 Protsedura car
5.3 Protsedura cdr
5.4 Protsedura append
6.0 Fundamentalni kontrolni strukturi
6.1 Kontrolna struktura cond (short for conditional)
6.2 Protsedura „case“
6.3 Protsedura „or“
6.4 Protsedura „and“
6.5 Protsedura if

BIBLIOGRAFIQ

1. Ezitsi za funktsionalno i logichesko programirane, M. Todorova
2. http://cs.gettysburg.edu/~tneller/cs341...
3. http://www.scheme.com/tspl3/


<< | >>