Hlavní navigace

Tvoříme skripty pro grafický editor GIMP (3)

20. 5. 2010
Doba čtení: 13 minut

Sdílet

V dnešní části seriálu o programovacím jazyku Scheme si ukážeme některé pokročilejší techniky skriptování v grafickém rastrovém editoru GIMP. Řekneme si, jak lze měnit parametry kreslicích nástrojů a jak se používají výběry (selections) při kreslení i implementaci některých grafických efektů.

Obsah

1. Změna základních parametrů kreslicích nástrojů

2. Práce s vlastnostmi vybraného kreslicího nástroje ve skriptech

3. První demonstrační příklad – výběr kreslicího nástroje a jeho parametrů

4. Použití výběrů při kreslení a editaci obrázků

5. Definice hranice výběru pomocí množinových operací a rozmazání jeho hranice

6. Práce s výběry ve skriptu

7. Druhý demonstrační příklad – vybarvení vybrané oblasti

8. Obsah dalšího pokračování seriálu

9. Odkazy na Internetu

1. Změna základních parametrů kreslicích nástrojů

V dnešní části seriálu o programovacím jazyce Scheme i o jeho použití ve funkci skriptovacího jazyka grafického rastrového editoru GIMP navážeme na obě části předchozí, v nichž jsme si vysvětlili, jakým způsobem je možné ve skriptech používat základní kreslicí nástroje GIMPu i to, jak se tvoří dialogy (formuláře) zobrazené uživateli před vlastním spuštěním skriptu. V těchto dialozích, jež slouží pro interaktivní specifikaci parametrů použitých skriptem, lze používat poměrně velké množství různých ovládacích prvků, jak těch „obyčejných“ (vstupní textové pole, rozbalovací výběrový seznam, checkbox), tak i prvků dostupných pouze v samotném rastrovém editoru GIMP (namíchání barvy z barvové palety, nastavení vlastností kreslicího nástroje atd.). Nejprve si řekněme, jakým způsobem lze ve skriptech využít vlastnosti kreslicích nástrojů zadané uživatelem s využitím dialogů GIMPu.

Obrázek 1: Úvodní dialog prvního demonstračního příkladu popsaného ve třetí kapitole, z něhož je patrné, že lze vybrat jak použitý kreslicí nástroj (listbox Tool), tak i styl kreslení (výběrové tlačítko Browse) a barvu (Color).

V případě, že je do dialogu (formuláře) přiřazeného ke skriptu vložen ovládací prvek typu SF-BRUSH, zobrazí se ve formuláři jako tlačítko s textem „Browse“ nebo lokalizovaným textem s podobným významem, vedle něhož se nachází malý obrázek představující stopu vybraného kreslicího nástroje. Pokud uživatel toto tlačítko stiskne, zobrazí se nový dialog, v němž lze zadat parametry vybraného kreslicího nástroje, především tvar stopy (jedná se o bitmapu pomocí níž je stopa kreslena), přítlak, průhlednost, postupné blednutí barvy s rostoucí délkou stopy atd. Podobným způsobem se chová i ovládací prvek SF-COLOR, po jehož aktivaci se zobrazí nový dialog s možností namíchání barvy z barvové palety. Samotná definice ovládacích prvků v dialogu i způsob jejich ovládání uživatelem je tedy poměrně jednoduchá.

Obrázek 2: Po stisku tlačítka Browse se zobrazí nový dialog s výběrem vlastností kreslicího nástroje.

2. Práce s vlastnostmi vybraného kreslicího nástroje ve skriptech

Poněkud složitější je však zpracování parametrů zadaných uživatelem po zavolání skriptu, především v případě ovládacího prvku SF-BRUSH, protože v příslušném parametru musí být ve strukturované podobě předány všechny zvolené vlastnosti kreslicího nástroje (připomeňme, že každému ovládacímu prvku na formuláři odpovídá pouze jeden parametr skriptu). Barva vybraná ovládacím prvkem SF-COLOR se do skriptu předává jako běžný seznam celočíselných hodnot s rozsahem 0 až 255, takže je velmi jednoduché získat hodnotu jednotlivých barvových složek – červené, zelené a modré (podpora pro další barvové modely je prozatím ještě poněkud problematická). Pokud je například barva předaná v parametru selected-color, lze její jednotlivé barvové složky získat následujícím způsobem:

(set red   (car selected-color))
(set green (car (cdr selected-color)))
(set blue  (car (cdr (cdr selected-color))))

nebo též zkráceně:

(set red   (car selected-color))
(set green (cadr selected-color))
(set blue  (caddr selected-color))

Ovládací prvek SF-BRUSH taktéž do skriptu předává uživatelem vybrané hodnoty v datové struktuře seznam, ovšem jeho struktura je poněkud složitější. První prvek seznamu obsahuje řetězec s názvem vybrané stopy; tuto hodnotu lze použít například při volání funkce gimp-context-set-brush. Druhým prvkem seznamu je číselná hodnota s průhledností kreslené stopy za níž následují další parametry, především měřítko stopy (jak jsme si již řekli v předchozí kapitole, jedná se o bitmapu, kterou lze v určitém rozsahu zvětšovat a zmenšovat), kreslicí režim aj. Pro přístup k těmto prvkům seznamu lze použít například klasické „lispovské“ funkce typu car a cdr, s nimiž jsme se v tomto seriálu již seznámili při zmínce o historii programovacího jazyka LISP. Ovšem ovládací prvek SF-BRUSH neumožňuje výběr kreslicího nástroje, dovoluje pouze měnit vlastnosti nástroje již vybraného. Pro výběr kreslicího nástroje tedy musíme v dialogu použít jiný ovládací prvek, například běžný výběrový seznam (listbox).

Obrázek 3: Spirála vykreslená prvním demonstračním příkladem pomocí kreslicího nástroje tužka (Pencil).

3. První demonstrační příklad – výběr kreslicího nástroje a jeho parametrů

V dnešním prvním demonstračním příkladu je mj. ukázán způsob použití ovládacích prvků SF-COLOR (výběr barvy v samostatném dialogu), SF-BRUSH (výběr vlastností štětce, taktéž v samostatném dialogu) a SF-OPTION (výběr jedné hodnoty ze seznamu). S využitím prvku SF-OPTION je uživateli nabídnut seznam tří základních kreslicích nástrojů, tj. tužky (pencil), štětce (brush) a rozprašovače (airbrush). Vlastní vykreslení úsečky, ze které se skládá spirála, podobně jako v demonstračních příkladech uvedených v předchozí části tohoto seriálu, je realizováno v pomocné funkci draw-line na základě pořadového čísla vybraného kreslicího nástroje. Vzhledem k tomu, že položky ve výběrovém seznamu SF-OPTION jsou číslovány od nuly, odpovídá tužka hodnotě nula, štětec hodnotě jedna a rozprašovač hodnotě dvě. Povšimněte si, že pro každý kreslicí nástroj existuje samostatná funkce, která kreslení provádí – gimp-pencil, gimp-paintbrush-default a gimp-airbrush-default:

; vykreslení úsečky vybraným kreslicím nástrojem
; 0 - tužka
; 1 - štětec
; 2 - rozprašovač
(define (draw-line tool selected-layer npoint segment)
    (if (= tool 0)
        (gimp-pencil selected-layer npoint segment)
        (if (= tool 1)
            (gimp-paintbrush-default selected-layer npoint segment)
            (gimp-airbrush-default selected-layer npoint segment)
        )
    )
)

Obrázek 4: Spirála vykreslená nástrojem štětec (Brush).

Následuje výpis zdrojového kódu prvního demonstračního příkladu:

; Skriptování v GIMPu (3)
; Demonstrační příklad číslo 1
; Tato funkce je zavolána z dialogu vyvolaného uživatelem
; z grafického uživatelského rozhraní GIMPu.
(define (script-fu-spirals-4
                             selected-image
                             selected-layer
                             selected-spins
                             center-x center-y
                             start-radius
                             end-radius
                             start-angle
                             tool
                             selected-brush
                             selected-color)
    ; pomocná funkce pro výpočet jedné souřadnice
    ; bodu ležícího na spirále
    (define (coord center radius function angle start-angle)
        (+ center (* radius (function (+ angle start-angle))))
    )
    ; vykreslení úsečky vybraným kreslicím nástrojem
    (define (draw-line tool selected-layer npoint segment)
        (if (= tool 0)
            (gimp-pencil selected-layer npoint segment)
            (if (= tool 1)
                (gimp-paintbrush-default selected-layer npoint segment)
                (gimp-airbrush-default selected-layer npoint segment)
            )
        )
    )
    ; definice lokálních proměnných
    (let*
        (
            ; konstanta - počet vrcholů křivky
            ; na jednu otočku spirály
            (vertexes-per-spin 100)
            ; počet prvků vektoru = (x1, y1, x2, y2)
            (npoint 4)
            ; vykreslovaná úsečka je představována vektorem
            ; (vektorem je v tomto kontextu myšlena datová
            ; struktura programovacího jazyka Scheme)
            (segment (make-vector 4 ))
            ; úhly zvětšující se pro každý další vykreslený úsek
            (alfa 0)
            (beta 0)
            ; konstanta - 2xPi
            (full-circle (* 3.1415927 2))
            ; počet vykreslených segmentů
            (step (/ full-circle vertexes-per-spin))
            ; úprava hodnoty zadané uživatelem
            (spins (+ selected-spins 1))
            ; vzdálenost vykreslovaného úseku od středu spirály
            (radius start-radius)
            (old-radius radius)
            ; změna vzdálenosti pro každý další úsek
            (radius-delta (/ (- end-radius start-radius) (* vertexes-per-spin spins 1)))
        )
        (gimp-context-push)
        (gimp-undo-push-group-start selected-image)
        ; nastavení způsobu kreslení na základě údajů zadaných uživatelem
        (gimp-context-set-foreground selected-color)
        (gimp-context-set-brush (car selected-brush))
        (gimp-context-set-opacity (car (cdr selected-brush)))
        (gimp-context-set-paint-mode (car (cdr (cdr (cdr selected-brush)))))
        ; programová smyčka, v níž se vykreslí úsečkové segmenty
        ; ze kterých se skládá aproximace spirály
        (while (<= alfa (* full-circle spins 1))
            (set! beta (+ alfa step))
            (set! radius (+ radius radius-delta))
            ; vypočet počáteční a koncové souřadice úsečky
            (vector-set! segment 0 (coord center-x old-radius cos alfa start-angle) )
            (vector-set! segment 1 (coord center-y old-radius sin alfa start-angle) )
            (vector-set! segment 2 (coord center-x radius cos beta start-angle) )
            (vector-set! segment 3 (coord center-y radius sin beta start-angle) )
            ; vykreslení úsečky vybraným kreslicím nástrojem
            (draw-line tool selected-layer npoint segment)
            ; přinutíme GIMP, aby obrázek průběžně vykresloval
            (gimp-displays-flush)
            ; přechod na další úsek
            (set! alfa beta)
            (set! old-radius radius)
        )
        ; uložíme stav obrázku na zásobník
        (gimp-undo-push-group-end selected-image)
    )
    (gimp-context-pop)
    ; naposledy přinutíme GIMP, aby finální obrázek vykreslil
    (gimp-displays-flush)
)
; základní informace o skriptu a definice dialogu
; zobrazeného uživateli
(script-fu-register "script-fu-spirals-4"
    _"_Spirals-4"
    _"Renders various spirals to current layer"
    "Pavel Tisnovsky"
    "Pavel Tisnovsky"
    "2010-05-18"
    "RGB*, INDEXED*, GRAY*"
    SF-IMAGE       "Image"         0
    SF-DRAWABLE    "Drawable"      0

    SF-OPTION     _"Spins"        '(_"1"
                                    _"2"
                                    _"3"
                                    _"4")
    SF-ADJUSTMENT _"X center"     '(200 0 999 1 10 0 1)
    SF-ADJUSTMENT _"Y center"     '(200 0 999 1 10 0 1)
    SF-ADJUSTMENT _"Start radius" '(20  0 999 1 10 0 1)
    SF-ADJUSTMENT _"End radius"   '(180 0 999 1 10 0 1)
    SF-ADJUSTMENT _"Start angle"  '(0 0 359 1 10 0 0)
    SF-OPTION     _"Tool"          '(_"Pencil"
                                     _"Brush"
                                     _"Airbrush")
    SF-BRUSH      _"Brush"         '("Circle (01)" 1.0 -1 0)

    SF-COLOR      _"Color"          "black"
)
; registrace skriptu do menu
(script-fu-menu-register "script-fu-spirals-4"
                         "<Image>/Root.cz")
; finito

Obrázek 5: Spirála vykreslená nástrojem rozprašovač (Airbrush).

4. Použití výběrů při kreslení a editaci obrázků

Při kreslení složitějších objektů v grafickém editoru GIMP nebo při editacích obrázků (včetně aplikace filtrů) je možné využívat i takzvané výběry (selection) nebo cesty (paths). Nejprve si ukažme, jakým způsobem je možné pracovat s výběry. Uživatel má při interaktivní editaci obrázků k dispozici hned několik nástrojů, pomocí kterých může vybírat a následně upravovat oblasti v rastrovém obrázku, se kterými je možné posléze provádět poměrně velké množství editačních operací – například je lze použít jako masku při všech editačních operacích (tuto masku lze zobrazit a popř. zase skrýt příkazem Select/Toggle Quick Mask nebo klávesovou zkratkou CTRL+Q), výběry je možné zkonvertovat na cesty (Select/To Path) nebo je převést na kanály (Select/Save to Channel) a následně uložit do seznamu kanálů přiřazených ke zpracovávanému obrázku. Hranici výběru je možné taktéž přímo vykreslit právě nastaveným kreslicím nástrojem (Selection Editor/Stroke).

Obrázek 6: Vytvoření výběru ze dvou sjednocených kružnic, od nichž byla odečtena plocha ve tvaru obdélníku.

5. Definice hranice výběru pomocí množinových operací a rozmazání jeho hranice

Samotné výběry se definují pomocí základních geometrických tvarů (obdélník/čtverec, elipsa/kružnice), ručním nakreslením hranice výběru, nástrojem, který automaticky vybere oblast podle barevných ploch v obrázku nebo podle změny kontrastu atd. To ovšem není zdaleka vše – při tvorbě výběrů lze aplikovat i základní množinové operace (sjednocení, rozdíl, doplněk), takže je například možné vytvořit výběr ze dvou sjednocených kruhů, od nichž je „odečtena“ plocha ve tvaru obdélníka – viz též obrázek číslo 6 i obrázek číslo 7. Pro volbu těchto dvou množinových operací se používají modifikátory CTRL a SHIFT (musí se stlačit před vlastním nakreslením hranice výběru, v průběhu kreslení totiž mají tyto klávesy jiný význam), doplněk (inverzi) lze vyvolat buď klávesovou zkratkou CTRL+I nebo příkazem Select/Invert.

Obrázek 7: Zobrazení výběru jako takzvané rychlé masky (quick mask).

Při úpravách plnobarevných obrázků, zvláště při editaci fotografií, bývá vhodné hranice výběru rozmazat, takže se například při vyplňování oblasti výběru použije v okolí jeho hranice postupný gradientní přechod od výplňové barvy k barvě pozadí (stejný přechod je aplikován i při posunu nebo kopii části obrázku). Interně je rozmazání hranice výběru řešeno aplikací Gaussovského filtru na bitmapu představující vybraný vzorek, což je nejlépe patrné při zobrazení výběru jako rychlé masky (Quick Mask). Rozmazání hranice výběru je ukázáno na obrázku 8 a 9.

Obrázek 8: Rozmazání hranice výběru nástrojem Feather.

Obrázek 9: Zobrazení výběru s rozmazanou hranicí v režimu rychlé masky.

6. Práce s výběry ve skriptu

Prakticky všechny operace s výběry, které může interaktivně provádět uživatel při úpravách obrázku, lze implementovat i ve skriptech. Pro tyto účely nabízí grafický editor GIMP poměrně velké množství různých funkcí, z nichž některé (pravděpodobně ty nejpoužívanější) jsou vypsány v následujících tabulkách. V první tabulce jsou vypsány operace použitelné pro vlastní definici oblasti výběru:

Název funkce Význam
gimp-rect-select výběr obdélníkové oblasti
gimp-round-rect-select výběr oblasti ve tvaru obdélníka se zaoblenými rohy
gimp-ellipse-select výběr oblasti ve tvaru elipsy nebo kružnice
gimp-free-select výběr polygonální oblasti
gimp-fuzzy-select výběr oblasti na základě podobnosti barev sousedních pixelů
gimp-by-color-select výběr všech pixelů stejné či podobné barvy

Obrázek 10: Dialog zobrazený při spuštění druhého demonstračního příkladu.

Následuje výpis některých funkcí, které je možné aplikovat na již vytvořený výběr:

Název funkce Význam
gimp-edit-clear vymazání výběru
gimp-edit-copy kopie výběru do interního bufferu
gimp-edit-cut provedení předchozích dvou příkazů
gimp-edit-paste vložení výběru z interního bufferu do obrázku
gimp-edit-stroke obtažení hranice výběru zvoleným kreslicím nástrojem
gimp-edit-fill vyplnění vybrané oblasti
gimp-selection-save uložení výběru do kanálu
gimp-selection-none zrušení výběru

Obrázek 11: Před spuštěním druhého demonstračního příkladu je obrázek prázdný (takže pokud zde vidíte prázdnou plochu, je to zcela v pořádku).

7. Druhý demonstrační příklad – vybarvení vybrané oblasti

Některé z funkcí, které byly vypsány v předchozí kapitole, jsou použity i v dnešním druhém demonstračním příkladu. Tento příklad po svém spuštění nabídne uživateli dialog (formulář), ve kterém je možné zadat barvu výplně a šířku oblasti rozmazání hranice výběru (navíc lze pomocí checkboxu povolit či naopak zakázat použití rozmazání hranice výběru). Po stisku tlačítka OK nejprve skript vytvoří výběr ve tvaru čtverce, jehož protilehlé rohy leží na souřadnicích [150, 150] a [250, 250], tj. ve středu obrázku o rozměrech 400×400 pixelů. Následně se k tomuto čtverci pomocí množinové operace sjednocení přidají další dvě oblasti, každá ve tvaru kružnice o poloměru 100 pixelů. Posléze je plocha výběru vybarvena barvou vybranou na dialogu a v posledním kroku je výběr z obrázku odstraněn (ovšem lze ho jednoduše obnovit klávesovou zkratkou CTRL+Z, která vrátí poslední provedenou operaci). Povšimněte si především toho, jaké parametry jsou předávány funkcím gimp-rect-select a gimp-ellipse-select. Kromě samotného tvaru výběru (jeho rozměrech a poloze počátečního bodu) je nutné specifikovat požadovanou množinovou operaci a taktéž parametry pro rozmazání hranice výběru.

Obrázek 12: Vybarvení oblasti výběru modrou barvou. Šířka rozmazání hranice výběru byla nastavena na velmi vysokou hodnotu (více než 20 pixelů).

Zdrojový kód druhého demonstračního příkladu má tvar:

; Skriptování v GIMPu (3)
; Demonstrační příklad číslo 2
; Tato funkce je zavolána z dialogu vyvolaného uživatelem
; z grafického uživatelského rozhraní GIMPu.
(define (script-draw-selection
                             selected-image
                             selected-layer
                             selected-color
                             use-feather
                             feather-radius)
    ; vytvoření výběru ve tvaru čtverce
    (gimp-rect-select
        selected-image       ; obrázek v němž se výběr vytvoří
        150 150 100 100      ; rozměry výběru
        REPLACE              ; přepsání oblasti původního výběru
        use-feather feather-radius) ; rozmazání hranice výběru
    ; přidání dalšího výběru ve tvaru kružnice
    (gimp-ellipse-select
        selected-image       ; obrázek v němž se výběr vytvoří
        80 80 100 100        ; rozměry výběru
        ADD FALSE            ; přidání oblasti ke stávajícímu výběru
        use-feather feather-radius) ; rozmazání hranice výběru
    ; přidání dalšího výběru ve tvaru kružnice
    (gimp-ellipse-select
        selected-image       ; obrázek v němž se výběr vytvoří
        220 220 100 100      ; rozměry výběru
        ADD FALSE            ; přidání oblasti ke stávajícímu výběru
        use-feather feather-radius) ; rozmazání hranice výběru
    ; volba barvy v paletě
    (gimp-palette-set-background selected-color)
    ; vykreslení obrazce - jeho výplň
    (gimp-edit-fill selected-layer BG-IMAGE-FILL)
    ; zrušení výběru (lze vrátit pomocí CTRL+Z)
    (gimp-selection-none selected-image)
    ; přinutíme GIMP, aby finální obrázek vykreslil
    (gimp-displays-flush)
)
; základní informace o skriptu a definice dialogu
; zobrazeného uživateli
(script-fu-register "script-draw-selection"
    _"_Draw selection"
    _"Draws geometric shape using selection to current layer"
    "Pavel Tisnovsky"
    "Pavel Tisnovsky"
    "2010-05-18"
    "RGB*, INDEXED*, GRAY*"
    SF-IMAGE       "Image"         0
    SF-DRAWABLE    "Drawable"      0

    SF-COLOR      _"Color"          "black"
    SF-TOGGLE     _"Feather"        FALSE
    SF-ADJUSTMENT _"Feather radius" '(10 1 100 1 10 0 0)
)
; registrace skriptu do menu
(script-fu-menu-register "script-draw-selection"
                         "<Image>/Root.cz")
; finito

Obrázek 13: Druhý demonstrační příklad byl spuštěn znovu na tom samém obrázku. Druhá vyplněná oblast (tentokrát s použitím žluté barvy) má šířku rozmazané hranice již menší – 10 pixelů.

Obrázek 14: Třetí spuštění demonstračního příkladu – přes žlutý obrazec byl nakreslen obrazec modrý, ovšem šířka rozmazání hranice výběru byla snížena na pět pixelů.

root_podpora

8. Obsah dalšího pokračování seriálu

V následující části tohoto seriálu se zaměříme na dvě poměrně rozsáhlé a přitom důležité oblasti funkcionality rastrového grafického editoru GIMP. Jedná se o práci s vrstvami a taktéž o použití různých filtrů, které tento grafický editor svým uživatelům nabízí. Právě s využitím těchto dvou nástrojů lze tvořit i velmi komplikované skripty, z nichž mnohé jsou dostupné již v základní instalaci GIMPu v menu Filters. Výsledek práce jednoho relativně jednoduchého skriptu využívajícího vrstvy a filtry, je zobrazen na obrázku číslo 15.

Obrázek 15: Výsledek činnosti poměrně jednoduchého skriptu, který nejprve na náhodných pozicích vykreslil několik hvězd (modifikací barev jednotlivých pixelů, tj. metodou, kterou jsme si již popsali předminule) a posléze použil Gaussovy filtry na jejich rozmazání.

9. Odkazy na Internetu

  1. A Script-Fu Tutorial
    http://www.li­nuxtopia.org/on­line_books/grap­hics_tools/gim­p_user_manual/en/gimp-using-script-fu-tutorial.html
  2. A Script-Fu Tutorial
    http://docs.gim­p.org/en/gimp-using-script-fu-tutorial.html
  3. Script-fu Tutorial
    http://www.se­ul.org/~grumbel/gim­p/script-fu/script-fu-tut.html
  4. Lambda calculus
    http://en.wiki­pedia.org/wiki/Lam­bda_calculus
  5. A Short Introduction to the Lambda Calculus
    http://www.cs­.bham.ac.uk/~ax­j/pub/papers/lam­bda-calculus.pdf
  6. A Tutorial Introduction to the Lambda Calculus
    http://www.inf.fu-berlin.de/leh­re/WS03/alpi/lam­bda.pdf
  7. (welcome '(schemers . org))
    http://www.sche­mers.org/
  8. Revised5 Report on the Algorithmic Language Scheme
    http://www.sche­mers.org/Docu­ments/Standar­ds/R5RS/
  9. The Revised6 Report on the Algorithmic Language Scheme
    http://www.r6rs­.org/
  10. Scheme
    http://groups­.csail.mit.edu/mac/pro­jects/scheme/
  11. The Kawa language framework
    http://www.gnu­.org/software/ka­wa/
  12. Scheme 48
    http://s48.org/
  13. Introductory textbooks for Schemers
    http://www.sche­mers.org/Docu­ments/#intro-texts
  14. Scheme (programming language)
    http://en.wiki­pedia.org/wiki/Sche­me_(programmin­g_language)
  15. Scheme
    http://cs.wiki­pedia.org/wiki/Sche­me
  16. Scheme-faq
    http://communi­ty.schemewiki­.org/?scheme-faq
  17. Scheme implementations
    http://communi­ty.schemewiki­.org/?scheme-faq-standards#imple­mentations
  18. Successful Scheme
    http://www.it­world.com/swol-1013-regex
  19. Guy L. Steele, Jr.
    http://en.wiki­pedia.org/wiki/Gu­y_L._Steele
  20. Gerald Jay Sussman
    http://en.wiki­pedia.org/wiki/Ge­rald_Jay_Sussman
  21. PLT Scheme
    http://www.plt-scheme.org/
  22. Quick: An Introduction to PLT Scheme with Pictures
    http://docs.plt-scheme.org/quick/
  23. PLT Scheme
    http://en.wiki­pedia.org/wiki/Plt_sche­me
  24. PLT Scheme Guide
    http://docs.plt-scheme.org/guide/
  25. The DrScheme Project: An Overview
    http://citese­erx.ist.psu.e­du/viewdoc/sum­mary?doi=10.1­.1.22.9543
  26. DrScheme
    http://en.wiki­pedia.org/wiki/DrSche­me
  27. How to Design Programs
    http://www.htdp­.org/
  28. An Introduction to Scheme
    http://www.ac­m.org/crossro­ads/xrds1–2/scheme.html

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.