ot M.Petrov(16-06-2007)
reiting (19)
[ dobre ]
[ zle ]
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/
<< | >>
|