A Factor programozási nyelv

Példaprogramok

I. Egyszerű Példaprogramok

A feladat:

Az egyes nyelvi elemek szemléltetésére szolgáló példák mellett, melyek általában közvetlenül a listenerből is futtathatóak, bemutatunk még néhány egyszerű példaprogramot. Ezeket általában a bevezető fejezetben látott módon hozhatjuk létre és másolhatjuk be őket a megfelelő fájlokba, ha ki szeretnénk próbálni, le szeretnénk futtatni őket. Eltérés ettől a legutolsó példa, melyhez nem kell semmilyen fájlt szerkesztenünk, mivel az csupán egy előre elkészített demóprogram betöltése egy gyári szótárból, amit azért mutatunk meg, hogy lássunk valami grafikus teljesítményt nyújtó programot is (bár igazából a listener is Factorban van írva, sőt a factorcode.org weblap alatt is Factor fut). A feladat tehát egyszerű, szemléltető példaprogramok írása az oldalon meglévő kódok mellé.

Készítő: Thier Richárd István
Készítés éve: 2011
Fejlesztőkörnyezet: Windows rendszer, Factor 0.94

! Copyright (C) 2011 Richard Thier. ! palindrome.factor USING: math kernel sequences unicode.categories unicode.case ; IN: palindrome : preproc-palindrome ( str -- newstr ) [ Letter? ] filter >lower ; : palindrome? ( str -- ? ) preproc-palindrome dup reverse = ; ! Használat listenerből: USE: palindrome "asdffdsa" palindrome? . ! Copyright (C) 2011 Richard Thier. ! factorial.factor USING: kernel math ; IN: factorial : push-is-zero ( x -- x ? ) dup 0 = ; : push-is-one ( x -- x ? ) dup 1 = ; : dupdec ( x -- x y ) dup 1 - ; : factorial ( x -- y ) push-is-zero [ 1 ] [ push-is-one [ 1 ] [ dupdec factorial ] if ] if * ; ! Használat listenerből: USE: factorial 120 factorial . ! Copyright (C) 2012 Richard Thier. ! See http://factorcode.org/license.txt for BSD license. USING: ; IN: numberz : teszt ( -- x ) 5 ; : teszt' ( -- x ) 5.0 ; : teszt'' ( -- x ) 5+1/3 ; : teszt''' ( -- x ) C{ 1 1/3 } ; ! Használat listenerből pl.: USE: numberz teszt''' . ! (demonstrálja, hogy a komplex literálhoz se kell semmit USE:-olni... ! Copyright (C) 2012 Richar Thier. ! poker-test.factor USING: kernel poker prettyprint ; IN: poker-test : pokerteszt ( -- ) HAND{ 7C 7D 7H AD AC AH 2C } best-holdem-hand drop value>hand-name . ; ! Használat listenerből: USE: poker-test pokerteszt ! (ennyit lehetett csak sajnos kisilabizálni a jelenlegi pokerszótárból) ! Végül de nem utolsó sorban egy kis előre adott grafikus demóprogram ! betöltése a listenerbe: USE: fluids ! Ez sokáig tart nekem (mire minden szótárt behoz) fluids ! Egyszerű demó, kattintgassunk a képen

II. Példaprogramok a factor előadáshoz

A feladat:

Ezek kicsiny példaprogramok, melyek a factor előadás színesítésének a lehetősége miatt kerültek elkészítésre. Sajnos idő hiányában akkor nem kerültek bemutatásra, de a diákkal egybecsomagolva kiosztásra kerültek, így a érdeklődők megnézhették őket. A programok között található többek között például a korábbi fejezetben is látott cserkeszes program (akkor még nem volt előkészítve deploy-hoz), egy a szokásosra kicsit jobban hasonlító if megvalósítás metaprogramozási eszközökkel (ebből az ötletből fejlődött tovább a következő példaprogram egyébként) és végül a szokásos faktoriális és palindrom programok 1-1 változatai.

Készítő: Thier Richárd István
Készítés éve: 2012
Fejlesztőkörnyezet: Windows rendszer, Factor 0.94
Megjegyzés: A mellékelt zip a ppt előadást is tartalmazza..
Letöltés: factorbev.zip

III. Imperatív programozási programcsomag

A feladat:

Az előző példaprogramcsomag ifmeta példáján felbuzdulva beadandó programként egy saját, imperatív-jellegű programozási lehetőségeket biztosító szótárcsomag megvalósítását tűztem ki célul, melynek segítségével a factorban programozó felhasználó kellemes szintaktikával és szemantikával képes:

A Megoldás egy bőven kommentelt és magyarázott kód, mely szinte csak és kizárólag a fordítási idejű szavakon alapuló metaprogramozást használja. Akiket érdekelnek a factor metaprogramozási elemei azoknak felbecsülhetetlen értékű forrás lehet ez a példacsomag, mivel kimondottan kevés metaprogramozással kapcsolatos anyag érhető el a factor nyelvvel kapcsolatban!

Készítő: Thier Richárd István
Készítés éve: 2012
Fejlesztőkörnyezet: Windows rendszer, Factor 0.94
Letöltés: imperative.zip
Egy kis bemutató, hogy a rendszer mire képes:
! imperative module test cases ! Copyright (C) 2012 Richard Thier. ! See http://factorcode.org/license.txt for BSD license. USING: imperative.if imperative.yield imperative.let imperative.invoke imperative.while io locals windows.types kernel math.parser ; ! USING-ok (elejen a sajat modulok imperativ programozashoz...) IN: imperative-tester ! Egyszeru hasznalat: :: myabs ( x -- y ) IF x < 0 THEN{ YIELD -x ; } ELSE{ YIELD x ; } ; ; ! YIELD hasznalata tobb visszateresi ertek megadasahoz: :: myswap ( x y -- y x ) YIELD y ; YIELD x ; ; ! Rekurzio es egymasba agyazhatosag: :: factorial ( x -- x! ) drop f ; ! ( a -- b ) alaku deklaracio a forditonak, hogy a ! rekurziohivasnal az ellenorzes sikeres legyen ! (benne legyen a szimbolumtablaba) :: factorial ( x -- x! ) IF x = 0 THEN{ YIELD 1 ; } ELSE{ IF x = 1 THEN{ YIELD 1 ; } ELSE{ YIELD x * factorial(x-1) ; } ; } ; ; ! rekurzio, egymasba agyazottsag es valtozohasznalat (deklaracio, olvasas, iras + lokalizacios teszt) :: fac2 ( x -- y ) drop f ; ! ( a -- b ) alaku deklaracio a forditonak, hogy a ! rekurziohivasnal az ellenorzes sikeres legyen ! (benne legyen a szimbolumtablaba) :: fac2 ( x -- y ) VAR out! ; IF x = 0 THEN{ LET out! = 1 ; } ELSE{ IF x = 1 THEN{ LET out! = 1 ; } ELSE{ LET out! = x * fac2(x-1) ; } ; } ; YIELD out ; ; ! minden eddigi egyben: :: fac3 ( x -- success facx ) VAR out1! ; IF x < 0 THEN{ YIELD FALSE() ; YIELD x ; } ELSE{ YIELD TRUE() ; IF x = 0 THEN{ LET out1! = 1 ; } ELSE{ IF x = 1 THEN{ LET out1! = 1 ; } ELSE{ LET out1! = x * fac2(x-1) ; } ; } ; YIELD out1 ; } ; ; ! ciklusok es fuggvenyhivasok tesztelese: : num2str ( n -- s ) number>string ; ! ez itt csak azert kell, mert kifejezesben nem kezelunk ! > jelet (at kell nevezni a fuggvenyt a hivashoz) :: printnumbers ( n -- ) VAR i! ; LET i! = 0 ; WHILE i < n DO{ INVOKE print(num2str(i)) ; LET i! = i + 1 ; } ; ;