„Scheme” változatai közötti eltérés

[nem ellenőrzött változat][nem ellenőrzött változat]
Tartalom törölve Tartalom hozzáadva
TXiKiBoT (vitalap | szerkesztései)
a Bot: következő hozzáadása: simple:Scheme (programming language)
SamatBot (vitalap | szerkesztései)
a kozmetikai javítások
1. sor:
A '''Scheme''' [[Programozási_nyelv|programozási nyelv]] a [[Lisp]] nyelvcsalád egyik tagja, illetve a [[Lisp]] egyik nyelvjárása (dialektusa). A ''Scheme'' tervezői arra törekedtek, hogy a Lispből minden fölösleges tulajdonságot kigyomláljanak, és egy egyszerű, kevés szabállyal leírható, de erőteljes nyelvet hozzanak létre. Például a ''Scheme''-ben egyetlen egységes névtérben találhatók a függvények és a változók. A nyelv precíz leírása és egyszerűsége miatt az oktatásban jól használható; alkalmazását valós problémák megoldására viszont némileg akadályozza, hogy kevés a szabványos eljárás, nincsenek kiterjedt szabványos könyvtárak. Ezt a hiányosságot azonban az utóbbi években igyekeznek pótolni ([http://srfi.schemers.org/ SFRI] = Scheme Request for Implementation) – ma már a legtöbb ''Scheme'' implementáció tartalmaz több-kevesebb SRFI-megvalósítást.
 
== A nyelv nagyon rövid története ==
40. sor:
A Scheme-ben a [[Lisp]] más nyelvjárásaiban szokásos függvény elnevezés helyett az eljárás szót használják.
 
A Scheme-ben a Lisp történetében szokatlan módon a lexikális hatókör szabálya érvényesül (mint az [[Algol_programozási_nyelvAlgol programozási nyelv|Algol]]ban vagy A [[Pascal_programozási_nyelvPascal programozási nyelv|Pascal]]ban. Ez azt jelenti, hogy az eljárások hívásakor a definíciójukkor érvényes ''környezetben'' keresik a változó értékét, nem pedig a hívási ''környezetben''. (A ''környezet'' nem más, mint változó-érték kötések halmaza.) A lexikális hatókörre mintapélda (az előző példákat is figyelembe véve):
 
(let ((d 1))
46. sor:
 
Ez a kifejezés a <tt>6</tt> értéket adja vissza, mivel az <tt>f</tt> eljárás definíciós környezetében a <tt>d</tt> változó értéke <tt>5</tt>.
Ha a dinamikus hatókör lenne érvényben (mint például a [[Common_Lisp_programozási_nyelvCommon Lisp programozási nyelv|Common Lisp]]ben a globális változók esetén) akkor a <tt>let</tt> kifejezés értéke <tt>2</tt> lenne.
 
A Scheme-ben az adatok típusa nem a változókhoz, hanem az értékekhez van kötve, azaz a Scheme dinamikus típusokat használó nyelv (mint a többi [[Lisp]]):
65. sor:
(define plusz2 (osszeado 2))
 
Az <tt>osszeado</tt> eljárással egy tetszőleges számmal növelő eljárást tudunk létrehozni. Annak ellenére, hogy a program futása – a kifejezések kiértékelése – közben újabb és újabb tárterületeket használ el ez általában nem jelenti azt, hogy gyorsan elfogy a rendszerünk összes tárkapacitása: ha egy érték többé már nem elérhető a rendszer az általa elfoglalt helyet újrahasznosítja. Ez a folyamat a ''szemétgyűjtés'' (ilyet más nyelvek is használnak, mint pl. a [[Perl_programozási_nyelvPerl programozási nyelv|Perl]], [[Python_programozási_nyelvPython programozási nyelv|Python]] vagy a [[Java_programozási_nyelvJava programozási nyelv|Java]]).
 
Az eljárások hívásánál a paraméterek átadása mindig ''érték szerint'' történik (call-by-value) (mint általában a [[Lisp]]ben, a [[C_programozási_nyelvC programozási nyelv|C]]-ben, [[Pascal_programozási_nyelvPascal programozási nyelv|Pascal]]ban, de például nem úgy, mint a [[Haskell_programozási_nyelvHaskell programozási nyelv|Haskell]]ben, ahol ún. ''szükség szerinti'' átadásról beszélünk (call-by-need)). Ezt a paraméterátadási stratégiát ''mohó kiértékelésnek'' is nevezzük, ahol a paraméterként megadott kifejezések az eljárás hívása előtt kiértékelődnek – ellentétben a ''lusta kiértékeléssel'', ahol a paraméterként átadott kifejezés csak akkor értékelődik ki, amikor szükség van erre az értékre. Példa:
 
(define (moho x y) x)
90. sor:
((if (> x 0) + *) x y))
 
Ez az eljárás összeadja két paraméterét ha <tt>x</tt> nagyobb mint <tt>0</tt>, egyébként összeszorozza őket. (A [[Common_Lisp_programozási_nyelvCommon Lisp programozási nyelv|Common Lisp]]pel ellentétben itt nincs szükség a <tt>function</tt> speciális formára, vagy a <tt>funcall</tt> függvényre, mivel egy névtérben laknak az eljárás-értékek az egyéb adatértékekkel.)
 
A Scheme nyelv talán egyik legérdekesebb fogalma a '''folytatás''' (continuation). A ''folytatás'' egy adott számítás menetének jövőjét jelenti, azaz egy program kifejezése kiértékelésének egy adott pillanatától számított további működését. A ''folytatás'' a más nyelvekben megtalálható goto, exit, return, catch névvel illetett utasítások, illetve mechanizmusok általánosítása. A ''folytatás'' megvalósítására a <tt>call-with-current-continuation</tt> (szokásos rövid neve: <tt>call/cc</tt>) eljárás szolgál.
A lap eredeti címe: „https://hu.wikipedia.org/wiki/Scheme