Programovací jazyk schémat. Programovací jazyk schémat. Instalace a konfigurace

Ken Dickey (překlad Alexey Desyatnik)

Alternativní pohled na svět

Každý programovací jazyk představuje určitý světonázor z hlediska toho, co umožňuje (či nedovoluje) používat. Tato série článků popisuje světonázor programovacího jazyka Schema („Schematic Worldview“). Tento světonázor obsahuje mnoho moderních programovacích prvků: podporu různých programovacích paradigmat, snadno kombinovatelné, opakovaně použitelné abstrakce, možnost vytvořit jazyk „šitý na míru“ konkrétní aplikaci, jasné rozlišení mezi přenosnými a nepřenosnými částmi programu, škálovatelnost, od jednotlivých utilit až po nejserióznější softwarové systémy.

Schéma začalo jako experiment ve vývoji programovacího jazyka k testování některých základních principů v teorii vývoje programu. Nyní se mu dostává přízně mnoha slavných univerzit (jako je MIT – Massachusetts Institute of Technology) jako první studovaný programovací jazyk. Kromě toho je obvod používán v průmyslu společnostmi jako DEC, Texas Instruments, Tektronix, Hewlett Packard a Sun.

Co je to schéma?

Schema je malý, extrémně čistý jazyk, který (to je nejdůležitější!) je radost používat. Obvod byl navržen tak, že malý počet univerzální vzory lze snadno použít v různých programovacích stylech: funkcionální, objektově orientovaný a imperativní. Jazyková norma zabírá pouze asi 50 (!) stran včetně formální definice sémantika. Schéma je založeno na formálním modelu výpočtu lambda, takže je plné funkcí, které jsou vhodné pro teoretiky; díky tomu je poměrně snadné vytvářet inteligentní nástroje pro vývoj softwaru.

Schéma má mechanismus lexikálního rozsahu, jednotná pravidla výpočtu a jednotné chápání datových typů. Schéma nemá žádnou koncepci ukazatele, neinicializovaných proměnných, speciálních smyčkových konstrukcí nebo jemného řízení úložiště.

Jak vypadá schéma? No, vypadá to hodně jako Lisp. Nenechte se vyděsit: vzhled Schémata lze změnit (a to je něco, co v budoucnu uděláme). To, na čem opravdu záleží, jsou koncepty za Blueprintem a jak je můžete použít. Pojďme tedy porovnat schéma a nějaký „klasický“ programovací jazyk – řekněme C. Možná už víte, že Scheme používá předponovou notaci, na rozdíl od infixové notace C:

Systém

Si

(+ 2 3 4)

(2 + 3 + 4)

(< low x high)

((nízký< x) && (x < high))

(+ (* 2 3) (* 4 5))

((2 * 3) + (4 * 5))

(f x y)

f(x, y)

(definujte (čtverec x) (* x x))

int čtverec (int x)

vrátit (x * x)

Ve schématu jsou všechny datové typy ekvivalentní. Cokoli, co lze provést s jedním datovým typem, lze provést se všemi ostatními. To je v příkrém rozporu s většinou programovacích jazyků, které mají speciální operace pro některé datové typy a konkrétně omezují použití některých jiných datových typů. Ve většině jazyků mají například čísla zvláštní práva: lze je používat, aniž by jim bylo pojmenováno (představte si například, že v BASICu muselo být každé číslo před použitím pojmenováno!). Funkce jsou naopak omezené: musí mít jméno.

Ve schématu jsou nepojmenované funkce vytvořeny pomocí klíčového slova lambda:

(jehněčí a(x)(* x x)); výsledkem je funkce!

(definujte sq(lambda(x)(*xx))

(sq 9);

27

((lambda (x) (* x x)) 9);

27

((if (foo? x) * +) 2 3 4) ; pokud (foo? x) je pravda,

; pak (* 2 3 4),

; jinak (+ 2 3 4)(definovat (vytvořit-přidat x) (lambda (y) (+ x y))

(definujte add3 (curried-add 3)) ; přidat3

- funkce

(přidat 3 7);

10

((curried-add 3) 7) ;

10

Nejdůležitější:

Proměnná může obsahovat hodnotu libovolného typu;

Jména označují významy; jména jsou nepovinná; ( Výraz – jeden nebo více tvarů v závorkách; ( Chcete-li vyhodnotit výraz, musíte nejprve vyhodnotit hodnoty všech formulářů v závorkách a poté použít hodnotu prvního formuláře na všechny ostatní; vnořené výrazy jsou také považovány za formy;) (+ Komentář začíná středníkem (;) a pokračuje do konce řádku;Chcete-li vyhodnotit výraz, musíte nejprve vyhodnotit hodnoty všech formulářů v závorkách a poté použít hodnotu prvního formuláře na všechny ostatní; vnořené výrazy jsou také považovány za formy;)) 7) ).

( Když je funkce vyhodnocena, "pamatuje si" stav "prostředí", ve kterém byla vytvořena (takže sečtení 3 si pamatuje, že X se rovnalo třem v době, kdy byla vytvořena, tj. v době, kdy byl výraz vyhodnocen ( lambdaKomentář začíná středníkem (;) a pokračuje do konce řádku;) (* Komentář začíná středníkem (;) a pokračuje do konce řádku;Komentář začíná středníkem (;) a pokračuje do konce řádku;)) y

x

definovat

sq je jen další forma psaní výrazu

(definujte sq(lambda(x)(*xx)) Existuje sedm možných typů výrazů:Konstanty:"foo#\Z3"řetězec"- Variabilní reference:- foo@#$!+-*/%<>

joe ( Výraz – jeden nebo více tvarů v závorkách; ( A) (* AAA))

dlouho ( jméno 37)

Vytvoření funkce: z< x 3) sqrt modulo)

Postup aplikace: ( krychle! Komentář začíná středníkem (;) a pokračuje do konce řádku; 5)

Stav: ( (pokud ( ( Přiřazení hodnoty:Komentář začíná středníkem (;) a pokračuje do konce řádku;) ( Přiřazení hodnoty:Chcete-li vyhodnotit výraz, musíte nejprve vyhodnotit hodnoty všech formulářů v závorkách a poté použít hodnotu prvního formuláře na všechny ostatní; vnořené výrazy jsou také považovány za formy;) ( soubor))

Následná sekvence: začít výrazy)

Schéma má obvyklou sadu datových typů:

Písmena (znak): #\a #\A \#mezera #\nový řádek

Řetězce: "řádek textu"

Pole (vektory): #(1 2 “řádek” #\Komentář začíná středníkem (;) a pokračuje do konce řádku; 5)

seznamy: (trochu (seznam) (seznamů))

čísla: 47 1/3 2,3 4,3e14 1+3i

Funkce

Booleovské hodnoty (boolean, true a false, v tomto pořadí): # t # F

Porty (např otevřít soubory nebo síťová připojení)

Symboly (symbol, obvykle používaný k označení proměnných): tento- je- "foo#\Z3"řetězec"- symbolExistuje sedm možných typů výrazů:"foo#\Z3"řetězec"32 > adfasf23@#$%!<

(přidat 3 7);

Vektor se může skládat z libovolných datových objektů;

Symbol může obsahovat písmena anglické abecedy, čísla a písmena + - . * / < = > ! ? : $ % _& ~ ^

Symboly nerozlišují velká a malá písmena (tj. SYMBOL a SyMboL jsou totožné)

Symboly se používají k reprezentaci proměnných (ale nejen to!)

Podle konvence (jen pro usnadnění) predikáty (výrazy pro kontrolu hodnoty) končí na otazník, a „nebezpečné“ (změna hodnoty proměnné) funkce končí vykřičníkem

Čísla jsou ve schématu obzvláště zajímavá: každé celé číslo je zlomek (racionální), zlomek je reálné číslo (reálné) a skutečné číslo– komplexní (komplexní). Čísla jsou klasifikována na základě přesnosti (přesná nebo přibližná - přesná / nepřesná):

(přesně? 3); #t

(přesně? 1/3); #t

(přesně? 2,3##); #F

(+ 2/3 1/2 5/6); 2

(celé číslo? 2); #t

(celé číslo? 3/7); #F

(skutečný? 2); #t

Filosofie schématu

Jednou z příjemných vlastností schématu, která zpočátku mnoho lidí mate, je absence omezení. Schéma je velmi expresivní: programátor může v tomto jazyce „vyslovit“ jednu myšlenku (akci) zcela odlišnými způsoby. Ve schématu má programátor svobodu – a odpovědnost – „říkat“ přesně tak, jak chce. V mnoha jiných programovacích jazycích musíte někdy hledat nějaké „prostupné řešení“, abyste z nich získali to, co potřebujete, ale ve schématu to prostě není nutné.

Abychom se zahřáli, sestavme párovou datovou strukturu. Pár se skládá ze dvou prvků získaných pomocí přístupových funkcí FIRST a SECOND (FIRST a SECOND). Funkce párování se bude nazývat PAIR. Musí být splněny následující vztahy: ( první ( pár 1 2)) rovná se 1, ( druhý ( pár 1 2)) rovná se 2. Pro ty, kteří Lisp znají, to není nic neobvyklého. Kolika různými způsoby však můžeme toto trio implementovat: PÁR, PRVNÍ, DRUHÝ?

; 1. Vektor

; je to možné a jednoduché (definujte vektor PAIR) , ale stylově je to lepší

(definujte (PÁR a b) (vektor a b))

(definovat (FIRSTaPair) (vector-ref aPair 0))

(definujte (SECOND aPair) (vector-ref aPair 1))

; 2. Funkce výběru

; Nezapomeňte na lexikální rozsah:

; každou funkci vytvořený funkcí PAIR, bude si pamatovat

; hodnoty a a b v době stvoření

(definujte (PÁR a b) (lambda (bool) (pokud bool a b)))

(definovat (FIRSTaPair) (aPair #t))

(definujte (SECOND aPair) (aPair #f))

; 3. Zprávy

(definovat(PÁROVÁ(a b)

(lambda (zpráva)

(případová zpráva; případová konstrukce pro každou hodnotu msg

; vystupuje přivlastnit si akce

((první)a ); pokud je zpráva symbolem první,

; vrátit a

((druhý)b))))

; Apostrof (‘) před symbolem brání výpočtu jeho hodnoty

; (bez něj by došlo k chybě „chybějící proměnná“)

(definovat (FIRSTaPair) (aPair ‘první))

(definovat (SECOND aPair) (aPair ‘druhý))

; 4. Aliasy: Ve schématu již existuje datový typ „pár“!

(definujte PAIRcons)

(definujte FIRSTcar)

(definujte DRUHÉ cdr)

; 5. Lambda funkce (předávání funkcí jako parametrů ostatním

; funkce)

(definujte (PÁR a b) (lambda (proc) (proc a b)))

(definovat (FIRSTaPair) (aPair (lambda (x y) x)))

(definujte (SECOND aPair) (aPair (lambda (x y) y)))

Pointa všeho výše uvedeného: i ty nejjednodušší věci se dají dělat úplně jinak.

Když už jsme rozehřátí, pojďme se podívat na starý dobrý faktoriál (připomenutí: faktoriál je součin všech celých čísel od 1 do daného čísla).

Nejprve rekurzivní definice:

(definovat (fakt n)

z< n 2)

(*n(fakt(-n1)))

Když jsem se (Ken Dickey) poprvé naučil takové rekurzivní definice, nejtěžší bylo pochopit, jak je skrytý stav funkce uložen v zásobníku. Malá transformace kódu zviditelní zásobník.

; funkce identity jen vrací svůj argument

(definujte (hodnotu identity) hodnotu)

; uložit formu funkce skutečnost

; (nyní pouze volá funkci cfact)

(definovat (fakt n) (cfact n identitu))

; A funkce cfact – vypočítá faktoriál

(definovat (cfact n k)

(pokud (< n 2)

(k 1)

(cfact(-n 1)

(lambda (výsledek) (k (* n výsledek))))))

Funkce cfact je verzí funkce fact, která používá pokračování. Místo vracení výsledku pokaždé funkce obdrží další argument, „pokračování“, který je volán s výsledkem výpočtů funkce.

Uvidíme, jak se hovor promění ( skutečnost 3) :

(fakt 3) se stává (identita cfact 3)

(identita cfact 3) se stává

(cfact 2

(lambda (výsledek)

(identita (* 3 výsledek)))) ; k'

To se zase přemění na

(fakt 1

(lambda (výsledek’) ;; k’’

((lambda (výsledek)

(identita (* 3 výsledek))) ; funkce k"

(*2 výsledek ')); argument prošel k"

((lambda (výsledek’) ;; k’’

((lambda (výsledek)

(identita (* 3 výsledky))) (* 2 výsledky’))

) 1)

((lambda (výsledek) (identita (* 3 výsledky))) (* 2 1))

(identita (* 3 (* 2 1)))

(* 3 (* 2 1))

-> 6

To není příklad toho, jak strašně složité věci lze snadno vyrobit z jednoduchých věcí. Proč jsme to udělali? Jde o to, že můžeme ovládat to, co se na zásobníku obvykle skrývá. To vám umožní dělat zajímavé věci. Jedno „pokračování“ můžeme ignorovat a místo něj použít jiné. Můžeme ovládat například dlouhodobé výpočty. Pokud budou trvat déle, než se očekávalo, můžeme uložit naše pokračování („kde jsme teď“) a zkusit jiný přístup k řešení problému. Li nová možnost ještě horší je, že se můžeme vrátit k uloženému „pokračování“ a pokračovat ve výpočtu. Pokusy o lepší výkon si samozřejmě můžeme ušetřit pro případ, že by to skutečně dopadlo lépe...

Použití „pokračování“ vám tedy umožňuje budovat velmi zajímavé, flexibilní řídicí struktury. Podívejme se nyní na faktoriál z druhé strany. Každé rekurzivní volání jednoduše posune další faktor do zásobníku. Ale nesmíme použít zásobník, pokud zavedeme další proměnnou „akumulátor“. Samozřejmě před zahájením výpočtů musí být akumulátor roven 1 (protože x *1 = x ).

(definovat (fakt n)

; definujte funkci pro výpočet faktoriálu s akumulátorem

(definovat (cfact _n acc)

(pokud (< _n 2)

(cfact (- _n 1) (* _n acc))

; zavolejte tuto funkci s akumulátorem rovným 1

(cfact n 1)

Na povrchu se tato funkce jeví jako rekurzivní. To však není pravda. Schéma má koncept „ocasní rekurze“, díky čemuž jsou běžné smyčky zbytečné. Každá funkce, která se volá v pozici „ocasu“ (tedy jako poslední akce), je jen smyčka.

Takže jsme převedli rekurzivní funkci na iterativní, cyklickou funkci. Existuje formální (teoreticky „správný“) způsob, jak toho dosáhnout; ale jedna pěkná vlastnost schématu je, že tyto transformace jsou jednoduché a intuitivní. Správně fungující programy lze psát rychle, i když mohou být zpočátku pomalé a náročné na paměť. Po odladění algoritmu je snadné je transformovat na mnohem efektivnější - a také správně fungovat! Konverze programů se pro zkušeného programátora Scheme stává druhou přirozeností.

Toto schéma má oproti jiným jazykům několik důležitých výhod. Jeho elegantně jednoduchá, jednotná struktura a triviální syntaxe se vyhýbají různým " zvláštní příležitosti" Jeho expresivita vám umožňuje vyhnout se plýtvání časem hledáním řešení: programátor se může soustředit na co Co musí to udělat, ale ne na to Jak udělej to. Schéma podporuje několik programovacích stylů, včetně aktuálně módního objektově orientovaného stylu, takže se programátor nemusí schématu přizpůsobovat; umí používat styl nebo způsob řešení problémů, na který je zvyklý. Formálnost schématu značně usnadňuje prokazování správnosti programů. Výkonné nástroje abstrakce vám umožňují oddělit části programu, které lze znovu použít, od částí, které jsou „šité na míru“ konkrétnímu problému/jazykové implementaci/operačnímu systému. Snadné kombinování různých funkcí a vytváření nových návrhů na jejich základě umožňuje vytvářet celé knihovny dobře vyladěných, univerzálních komponent.

Jinými slovy, pokud chcete psát složité, správné programy, ale nechcete nad tím strávit roky, Scheme je to, co potřebujete k úspěchu!

Krátký seznam nejznámějších implementací schématu.

Chez Scheme a MacScheme jsou jedny z nejlepších komerčních implementací; existuje však mnoho bezplatných interpretů a kompilátorů schémat pro vzdělávací účely i seriózní práci.

Jeden z nejlepší systémy pro Windows a Linux - MzScheme a na jeho základě postavený MrEd (systém pro tvorbu portable GUI uživatel) a DrScheme (možná nejpohodlnější existující vývojové prostředí programů).

Jazyk Scheme má tradičně poměrně dobrou podporu pro Emacs. Tato podpora je poskytována sadou balíčků, které mohou pracovat s oběma libovolnými implementacemi tohoto jazyka ( schéma-režim, cmuscheme, šarlatán) a podporují pouze konkrétní implementace ( xscheme, gds, včelí režim, gambit). Podpora specifická pro implementaci je obvykle poněkud obsáhlejší než balíčky, které podporují všechny implementace.

Tento článek se snaží pokrýt všechny otázky podpory pro programování ve schématu a nejprve hovoří o věcech společných všem implementacím a teprve poté uvažuje o balíčcích, které implementují podporu konkrétní verze jazyk.

Režim schématu

Režim schématu dodávaný s distribucemi Emacs je modifikace lisp-mode pro práci se zdrojovým kódem v jazyce Scheme. Tento balíček implementuje následující funkce:

  • zvýraznění syntaxe
  • odsazení
  • zvýraznění párových závorek

Na základně schéma-režim Bylo vytvořeno několik dalších balíčků - a další, které rozšiřují jeho funkčnost přidáním funkcí pro spouštění kódu přímo z vyrovnávací paměti Emacs atd. věci.

Tento režim je automaticky povolen pro soubory, které používají standardní rozšíření pro soubory se zdrojovým kódem na Scheme - .scm, .ss atd. Chcete-li povolit tento režim pro ostatní soubory přidejte do inicializačního souboru následující kód (nahraďte .scm požadovanou příponou):

(add-to-list "auto-mode-alist"("\\.scm$" . schéma-režim))

Pokud chcete změnit chování balíčku, můžete nastavit parametry ve funkci, která po přidání do proměnné schéma-režim-hook bude volána, když je režim povolen v konkrétní vyrovnávací paměti. Některé parametry lze navíc nastavit pomocí standardních konfiguračních nástrojů. Odpovídající skupina nastavení se nazývá schéma.

Cmuscheme

Plastová taška cmuscheme byl napsán Olinem Shiversem před mnoha lety, ale stále je jedním z hlavních balíčků Scheme. Tento balíček implementuje interaktivní práci s tlumočníky Jazyk schématu. Interakce s tlumočníkem je realizována pomocí možností balíčku příchod, součástí Emacsu.

Nastavení balíčku

Nastavení balíčku je poměrně jednoduché - vložte následující kód do svého inicializačního souboru

(autoload "spustit-schéma "cmuscheme" "Spustit podřízené schéma" t) (setq název-programu schématu "mzscheme" )

a balíček se automaticky načte při prvním spuštění funkce run-scheme. Druhý řádek v tomto příkladu se používá k zadání názvu interpreta schématu, který můžete nahradit svým oblíbeným dialektem. Všechna nastavení pro tento balíček jsou také dostupná pro interaktivní konfiguraci prostřednictvím konfigurační skupiny cmuscheme.

Vyrovnávací paměť tlumočníka vytvořená balíčkem používá speciální režim- režim inferior-scheme-mode, který lze nakonfigurovat pomocí háku inferior-scheme-mode-hook. Kromě toho, pokud existuje soubor ~/.emacs_SCHEMENAME nebo ~/.emacs.d/init_SCHEMENAME.scm (kde SCHEMENAME je název překladače), budou provedeny ihned po načtení překladače.

Práce s balíčkem

Hlavní funkcí balíčku je funkce run-scheme, která spouští vybraný interpret jazyka Scheme a umožňuje interaktivní spouštění kódu bez opuštění Emacsu.

Díky tomu můžete ovládat, která část kódu (vyhrazený blok, definice funkce nebo jeden výraz) bude provedena pomocí různé funkce, definovaný balíčkem - funkce scheme-send-definition (kombinace klávesy C-c C-e nebo C-M-x) předá aktuální definici interpretu k provedení; Funkce scheme-send-region (C-c C-r) vám umožňuje spustit vybraný blok zdrojový kód; funkce scheme-send-last-sexp (C-x C-e) se používá k vyhodnocení výrazu, který je před kurzorem; a funkce scheme-load-file (C-c C-l) umožňuje načíst celý soubor do interpretru (umožňuje spouštět kód z libovolného souboru určeného uživatelem, nejen z aktuální vyrovnávací paměti).

Interpret schématu běží v samostatném bufferu nazvaném *schéma* , kde se také vypisují výsledky vyhodnocování výrazů a funkcí. Pro rychlé přepnutí do tohoto bufferu z bufferu zdrojového textu existuje samostatná funkce switch-to-scheme (C-c C-z). Kromě toho, protože je často nutné spustit kód a zobrazit výsledky, balíček také definuje dvě funkce, které odesílají kód do interpretu k provedení a přepínají do *schema* vyrovnávací paměti - scheme-send-definition-and-go ( C-c M-e) pro výpočet aktuální definice a schéma-odeslat oblast-a-jdi (C-c M-r) pro vyhodnocení přiděleného zdrojového kódu.

Pro práci s makry poskytuje balíček funkci scheme-expand-current-form (C-c C-x), která umožňuje rozšířit definici aktuálního makra do odpovídajícího kódu schématu. Rozšíření kódu provádí interpret a výstup do *schéma* vyrovnávací paměti. A při práci s implementacemi Scheme, které podporují kompilaci zdrojového kódu, může uživatel využít funkce schéma-kompilovat-soubor (C-c C-k) a schéma-kompilovat-definice (C-c M-c), které zkompilují soubor nebo aktuální definici, resp. .

Jak je uvedeno výše, ve vyrovnávací paměti tlumočníka existuje speciální režim - režim inferior-scheme-mode, ve kterém fungují všechny příkazy režimu comint a také následující příkazy cmuscheme- schéma-kompilovaný-soubor (C-c C-k), schéma-načtení-soubor (C-c C-l), schéma-odeslání-poslední-sexp (C-x C-e) a schéma-odeslání-definice (C-M-x).

Šarlatán

Balíček Quack je rozšířením balíčku cmuscheme a implementuje následující dodatečné funkce (mnoho z nich se primárně týká práce s PLT Scheme):

  • nabídky, které umožňují přístup k dokumentaci k jazyku, interpretu a SRFI, stejně jako možnost vyhledávat popis názvu funkce umístěného na aktuální pozici kurzoru;
  • nové sady podsvícení pro font-lock- pro schéma PLT a rozšířené, pro další implementace;
  • možnost použití řeckého symbolu lambda k označení výrazů lambda (příklady jsou uvedeny níže);
  • další možnosti a příkazy pro vkládání správných otevíracích a zavíracích závorek;
  • rozšíření pro pravidla odsazení s možností konfigurace pro různé interprety schémat;
  • rozšířená verze příkazu run-scheme, která zná názvy příkazů oblíbených interpretů schémat a také si pamatuje poslední běžící verze tlumočník;
  • rozšířená verze příkazu switch-to-scheme;
  • schopnost zobrazit obsah kolekcí .plt a příkazy k otevření vyrovnávací paměti Dired pro požadovanou kolekci.

Instalace a konfigurace

Balíček napsal Neil Van Dyke a je k dispozici ke stažení z webu autora. Balíček se nainstaluje zkopírováním do adresáře, kde jej Emacs najde, a načte se příkazem:

(vyžadovat "kvak")

Všechna nastavení balíčku lze konfigurovat pomocí skupiny nastavení kvákadla nebo pomocí nabídky kvákadlo. Tato nastavení zahrnují adresy příruček a SRFI, definující předponovou klávesovou zkratku používanou balíčkem a tak dále.

Uživatelům PLT Scheme se doporučuje stáhnout si manuály pro tento interpret z webových stránek projektu a nainstalovat je do kolekce doc. Umístění kolekcí PLT Scheme je určeno buď proměnnou quack-pltcollect-dirs, která dokáže vypsat všechny adresáře s pracovními kolekcemi, popř. proměnné prostředí PLTHOME a/nebo PLTCOLLECTS .

Balíček také vyžaduje přítomnost programu wget, který bude použit pro přístup k SRFI.

Práce s balíčkem

Po stažení balíčku navíc funkce cmuscheme A schéma-režim Zpřístupní se funkce definované balíčkem. Tyto funkce může uživatel provádět buď pomocí standardních mechanismů (klávesové zkratky a/nebo spouštění podle názvu funkce) nebo pomocí nabídky Quack.

Dokumentaci můžete zobrazit pomocí několika funkcí. Funkce quack-view-manual (C-c C-q m) slouží k prohlížení dokumentace ve webovém prohlížeči. Tento příkaz umožňuje zobrazit základní dokumentaci pro jazyk Scheme a dokumentaci pro konkrétní implementace. Pro zobrazení SRFI je definován samostatný příkaz - quack-view-srfi (C-c C-q s), který si vyžádá číslo požadovaného dokumentu a otevře jej v prohlížeči. A pro uživatele PLT Scheme je k dispozici také příkaz quack-view-keyword-docs (C-c C-q k), který zobrazí dokumentaci pro dané klíčové slovo ( Činnost tohoto příkazu závisí na správné instalaci dokumentace schématu PLT).

Jak je uvedeno výše, balíček implementuje funkci run-scheme (C-c C-q r), která vám umožňuje spouštět překladače jazyka Scheme, vybírat je ze seznamu známých (včetně spuštění s nezbytnými možnostmi) a také si pamatuje poslední uživatele. výběr.

Pro uživatele PLT Scheme jsou také definovány pohodlné funkce pro práci se sbírkami. Funkce quack-find-file (C-c C-q f) otevře soubor pomocí dat z aktuálního kontextu k získání názvu souboru. Pokud například použijete tuto funkci, když je kurzor na kódu (vyžadovat (lib "list.ss")), budete vyzváni k otevření souboru list.ss z kolekce mzlib. Navíc je definována funkce quack-dired-pltcollect, která umožňuje otevřít buffer Dired pro požadovanou kolekci schématu PLT (při zadávání názvu může uživatel použít automatické doplňování názvu kolekce).

Tento balíček také implementuje několik funkcí, které mění formátování kódu, takže jeho použití je pohodlnější. Funkce quack-tidy-buffer (C-c C-q t) znovu odsadí kód, nahradí tabulátory mezerami, odstraní nadbytečné prázdné řádky, odstraní koncové bílé znaky z řádků a přidá nový řádek na konec souboru, pokud tam žádný není. Funkce quack-toggle-lambda (C-c C-q l) změní deklaraci aktuální funkce from (define (func args) ...) to (define func (lambda (args) ..)) , což umožňuje zobrazit v kódu znak lambda (se zapnutou možností zobrazení tohoto symbolu). Například takto:

Balíček GCA

G.C.A.- balíček určený pro efektivní práce se zdrojovým kódem schématu. Byl navržen tak, aby podporoval schéma Gauche, ale může být použit s jinými dialekty. Jako šarlatán, rozšiřuje funkčnost balíčku cmuscheme.

Tento balíček má následující vlastnosti:

  • vkládání částí kódu pomocí mechanismu šablony
  • zobrazit popisy funkcí
  • doplnění jména

Tento balíček má určité architektonické rozdíly od jiných balíčků - místo interakce s pomocí interpretů standardní vstup a výstup, tento paket používá k přenosu dat jednoduchý síťový protokol. Tento přístup umožňuje provádět více úkolů, ale je vysoce závislý na implementaci interpretu a vyžaduje samostatný proces Scheme (server gds), který bude použit k interakci s jinými procesy.

Instalace a konfigurace

Plastová taška gds přichází s nejnovější verze Guile, takže vše, co musíte udělat, je přidat zdrojové soubory Emacs Lisp do vaší vyhledávací cesty Emacs a přidat následující řádek do inicializačního souboru:

(vyžadovat "gds")

Tento příkaz stáhne balíček a spustí samostatný proces, který bude zodpovědný za interakci s interprety schémat. Stojí za zmínku, že aby balíček fungoval, musí být ve vyhledávacích cestách Guile přítomen samostatný balíček pro Scheme. Pokud je balíček v nestandardním umístění, můžete určit jeho umístění pomocí proměnné gds-scheme-directory, jinak, pokud tento balíček není přítomen, nebude balíček načten celý.

Další nastavení lze nastavit pomocí skupiny nastavení gds.

Práce se zdrojovým kódem

Plastová taška gds používá pro výpočet kódu stejné klávesové zkratky jako cmuscheme. Výjimkou je funkce gds-eval-expression (C-c C-e), která vyhodnocuje výraz zadaný v minibufferu.

Jeden z pěkných implementovaných doplňků gds je dokončit názvy funkcí a proměnných a také získat nápovědu ke konkrétním symbolům a/nebo vyhledat symbol podle názvu.

Doplňování jmen provádí funkce gds-complete-symbol (zkratka M-TAB), která se snaží najít všechny známé symboly, jejichž názvy odpovídají písmenům před kurzorem. Pokud je jedno jméno nalezeno, je okamžitě vloženo, ale pokud existuje více možností, zobrazí se nové okno, ve kterém může uživatel vybrat požadované jméno.

Získání nápovědy pro konkrétní symbol se provádí pomocí funkce gds-help-symbol (C-h g), která poskytuje stejné výsledky jako spuštění příkazu (help SYMBOL) v interaktivním prostředí Guile. Název symbolu je vyzván uživatelem prostřednictvím minibufferu, ale výchozí hodnotou je název, na kterém je kurzor. Pokud si nepamatujete přesný název symbolu, můžete použít funkci gds-apropos (C-h G), která je podobná spuštění (apropos REGEXP) v Guile a která vytiskne seznam symbolů, jejichž názvy odpovídají zadanému regulární výraz.

Ladění

Abychom využili příležitosti gds při interaktivní práci musí uživatel stále výslovně specifikovat moduly, se kterými bude pracovat gds. Například pomocí následujícího kódu načtete všechny moduly potřebné pro provoz:

(use-modules (ladicí pasti ice-9 gds-client)) (named-module-use! "(guile-user) "(ice-9 session)) (gds-accept-input #f)

Poté můžete pracovat s gds. K nastavení bodu přerušení v proceduře název_proc se používá následující, vypočítané ve vyrovnávací paměti zdrojového kódu:

(install-trap (make #:behaviour gds-debug-trap #:procedure proc_name))

a po zavolání zadané procedury obdržíte ve vyrovnávací paměti gds něco takového:

Postup volání: => s s --:** PID XXXXX (Guile-Debug)--Vše---------

v této vyrovnávací paměti můžete procházet zásobník, zobrazit jeho stav, pokračovat ve vykonávání programu a/nebo jej procházet. Práce v zásobníku zásobníku je zajištěna pomocí řady příkazů vázaných na jednotlivé klíče.

K pohybu v zásobníku volání funkcí lze použít následující klávesy: u , C-p a šipka nahoru se používají k posunu v zásobníku volání nahoru a k výběru daného rámce (funkce gds-up), d , C-n a šipka dolů slouží k pohybu dolů. (gds-down) a klávesa RET se používá k výběru snímku, na kterém je umístěn kurzor.

Výběr rámečku zásobníku způsobí, že se zobrazí odpovídající část zdrojového kódu. Některé funkce navíc při provádění využijí také prostředí spojené s vybraným rámcem.

Mezi další funkce, které fungují ve vyrovnávací paměti zásobníku, patří následující:

gds-evaluate (klíč e) umožňuje vyhodnotit výraz pomocí prostředí odpovídajícího vybranému snímku, přičemž výsledek se zobrazí v oblasti echa; gds-frame-info(i) zobrazuje informace o vybraném rámci - řádek ve zdrojovém souboru, odpovídající výraz, typ rámce atd.; gds-frame-args(A) zobrazuje argumenty rámce aplikace; gds-proc-source(S) zobrazuje zdrojový kód volané procedury. Tato funkce je velmi užitečná v případech, kdy je procedura vytvořena anonymním výrazem lambda, protože takové procedury jsou v zásobníku volání funkce zobrazeny jako Z čehož není jasné, co se bude dělat dál.

Chcete-li pokračovat ve vykonávání přerušeného programu, gds nářadí následující funkce:

gds-go (g, c nebo q) pokračuje ve vykonávání programu; gds-step-file (SPC) provede jeden krok funkcí, které patří do stejného zdrojového souboru jako vybraný rámec zásobníku. Funkce z jiných souborů budou provedeny, ale bez vstupu do nich; gds-step-into (i) provede další krok. Toto je nejpodrobnější úroveň provádění programu; gds-step-over (o) spustí program, dokud není dokončeno provádění vybraného rámečku zásobníku.

Pomocí všech těchto funkcí může vývojář přijímat podrobné informace o stavu programu a dostane příležitost najít a opravit chyby.

Schéma48

schéma48- další balíček na základě cmuscheme, ale poskytuje rozšířenou podporu pro implementaci Scheme48. Tento balíček přidává podporu font-lock pro klíčová slova a operátory specifická pro Scheme48, stejně jako další klávesové vazby pro příkazy vyhodnocení výrazů.

Postup instalace tohoto balíčku je standardní - dejte gambit.el na místo, kde jej Emacs najde a přidá následující řádky do inicializačního souboru:

(automatické načítání "gambit-inferior-mode "gambit" "Zahákněte režim Gambit do cmuschema.") (automatické načítání "gambit-mode "gambit" "Zapojte režim Gambit do schématu.") (add-hook "inferior-scheme-mode-hook (funkce gambit-inferior-mode)) (add-hook "scheme-mode-hook (funkce gambit-mode)) (setq název-programu schématu "gsi -: d-")

Interpret Gambit se spouští pomocí funkce run-scheme implementované v cmuscheme, Ale gambit přidává k němu rutiny výstupního filtrování, což balíčku umožňuje získat informace o umístění ve zdrojovém souboru. Po spuštění interpretu je uživatel schopen používat standardní kombinace klíče pro provádění a kompilaci kódu - C-x C-e, C-c C-l, C-c C-k atd.

Kromě funkcí cmuscheme, plastový sáček gambit nabízí několik funkcí určených pro ladění zdrojového kódu:

gambit-continue (F8 nebo C-c c) pokračujte ve vykonávání kódu. Podobně jako u příkazu,c tlumočníka; gambit-crawl-backtrace-newer (F9 nebo C-c ]) přejít na předchozí snímek v řetězci. Rovněž tým - tlumočník; gambit-crawl-backtrace-older (F10 nebo C-c [) přejít na další snímek v řetězci. Podobně jako u příkazu + interpreter; gambit-step-continuation (F11 nebo C-c s) provést jeden výpočetní krok včetně zadání volané funkce. Rovněž příkaz tlumočníka; gambit-leap-continuation (F12 nebo C-cl) provést jeden krok výpočtu bez zadání volané funkce. Podobně jako u příkazu interpret,l; gambit-kill-last-popup (C-c_) odstraňte okno, které bylo vytvořeno pro zobrazení výrazu.

Pro tyto příkazy existují kratší klávesové zkratky: M-c , M-[ , M-] , M-s , M-l a M-_ , ale ve výchozím nastavení nejsou povoleny, protože zcela nedodržují konvence klávesových zkratek v Emacsu. Chcete-li povolit jejich použití, musíte spustit následující příkaz (nebo jej vložit do inicializačního souboru):

(setq gambit-repl-command-prefix "\e" )

Včelí režim (bmacs)

bmacs je implementace integrovaného softwarové prostředí pracovat s Bigloo Scheme. Tento balíček implementuje následující funkce:

  • ladění kódu;
  • profilování;
  • automatické vytváření a aktualizace souborů Makefiles;
  • navigace kódem;
  • integrace se systémy správy verzí;
  • prohlížení dokumentace;
  • interaktivní provádění kódu;
  • makro expanze;
  • určitá podpora pro gramotný styl programování.

Tento balíček vyžaduje pro práci řadu dalších nástrojů, z nichž většina je dodávána s Bigloo. Dokumentaci lze nalézt na webu projektu nebo v rámci distribuce.

Instalace a konfigurace

Tento balíček je dodáván jako součást Bigloo Scheme a je umístěn v podadresáři bmacs distribuce. Chcete-li nainstalovat balíček, přejděte do tohoto adresáře a spusťte tam příkaz:

Make make install EMACSDIR =

která založí potřebné soubory na vámi uvedené místo. Poté můžete do inicializačního souboru přidat následující řádky, aby se balíček automaticky načetl, když otevřete zdrojové soubory:

(autoload "bdb "bdb" "režim bdb" t) (autoload "bee-mode "bee-mode" "bee mode" t) (setq auto-mode-alist (připojit "(("\\.scm$" . včelí režim) ("\\.sch$" . včelí režim) ("\\.scme$" . včelí režim) ("\\.bgl$" . včelí režim) ("\\.bee$ " . bee-mode)) auto-mode-alist))

Nastavení balíčku lze nastavit pomocí skupiny nastavení včel, která poskytuje nastavení pro včelí režim a skupiny dbg & chyba, slouží k nastavení nastavení ladicího programu.

Práce se zdrojovým kódem

Po stažení včelí režim uživatel může provádět základní příkazy pomocí odpovídajících ikon panelu nástrojů nebo výběrem potřebných položek z nabídky Bee, která se objeví po spuštění režimu.

Chcete-li odsadit v souladu s konvencemi Bigloo, balíček včelí režim definuje několik funkcí: bee-indent-sexp (C-M-q) odsadí aktuální výraz, bee-indent-define ( C-c TAB C-d) to dělá pro aktuální definici funkce, bee-indent-last-sexp (C-c TAB C-l) odsadí výraz před kurzor atd.

Velmi důležitou sadou funkcí používaných při práci se zdrojovým kódem jsou funkce pro vyhledávání definic funkcí a proměnných. Chcete-li najít definici proměnné, můžete použít bee-tags-find (C-x 5 .) nebo bee-tags-find-variable (C-c C-d f). A pro hledání definice modulu existuje funkce bee-find-module (C-c C-d m). Kromě, včelí režim předefinuje dvě klávesové zkratky - M-. & M-, které se vážou k funkcím bee-tag-find a bee-tags-find-next, což umožňuje nalezení definic funkcí a tříd.

Pro zjednodušení práce s moduly včelí režim definuje sadu funkcí, které spravují seznam modulů importovaných aktuálním zdrojovým kódem - funkce bee-import-binding (C-c RET i), stejně jako seznam funkcí a proměnných exportovaných z aktuálního modulu - bee-export- funkce ( C-c RET f) a včelí-export-proměnná (C-c RET v). Kromě toho existuje samostatná funkce, která umožňuje importovat symboly ze souborů C - bee-import-c-file (C-c RET c), a také aktualizuje Makefile, aby přidal závislost pro kompilaci odpovídajícího kódu.

Balíček také poskytuje určitou podporu pro takzvané gramotné programování. Poskytovaná podpora není kompletní, ale umožňuje alespoň vkládat do kódu odkazy na popisy modulů a funkcí. Toho je dosaženo použitím klíčových slov @path , @node & @deffn v komentářích modulu a popisech funkcí. Klíčová slova @path & @node definují soubor a sekci dokumentace, která popisuje daný modul a jsou specifikována v komentáři k deklaraci modulu. A klíčové slovo @deffn je uvedeno v komentáři k funkci. Pomocí těchto klíčových slov je vývojář schopen rychlý přechod do příslušných sekcí a popisů funkcí, což umožňuje vylepšenou dokumentaci kódu.

Spuštění a sestavení kódu

Stejně jako ostatní balíčky, včelí režim umožňuje spouštět kód schématu přímo z vyrovnávací paměti Emacs. Chcete-li spustit tlumočník, musíte provést funkci ude-repl-other-frame (C-c C-r C-r), vyberte odpovídající ikonu na panelu nástrojů ( Repl), nebo odpovídající položku nabídky.

A po načtení interpretu může uživatel spustit kód pomocí následujících funkcí:

  • ude-repl-send-buffer (C-c C-r b) odešle celý buffer k výpočtu;
  • ude-repl-send-region (C-c C-r r), odešle vybraný blok kódu do interpretu;
  • bee-repl-send-define (C-c C-r d) se používá k provedení aktuální definice;
  • bee-repl-send-last-sexp (C-c C-r l) vyhodnotí hodnotu výrazu před kurzorem;
  • bee-repl-send-toplevel-sexp (C-c C-r t) se používá k vyhodnocení celého aktuálního výrazu.

Při použití maker je velmi často nutné je umět rozbalit. Stejně jako při práci s běžným kódem, včelí režim implementuje sadu funkcí pro rozšiřování maker do vašeho kódu (v tomto případě bude celý buffer prohledán na přítomnost definic maker):

  • bee-expand-buffer (C-c C-e C-e) způsobí rozšíření maker v aktuálním bufferu;
  • bee-expand-region (C-c C-e C-r) rozšiřuje makra v kódovém pozadí;
  • bee-expand-define (C-c C-e C-d) rozšiřuje makra v aktuální definici
  • bee-expand-last-sexp (C-c C-e C-l) rozšiřuje makra ve výrazu před kurzorem;
  • bee-expand-toplevel-sexp (C-c C-e C-t) rozšiřuje makra v aktuálním výrazu.

Chcete-li zkompilovat programy, musíte mít soubor Makefile, který popisuje závislosti mezi moduly a určuje příznaky kompilace. Projekt vyžaduje tzv. kořenový adresář - včelí režim se pokusí určit kořenový adresář projektu vyhledáním jednoho ze souborů Makefile , .afile nebo .etags, případně lze kořenový adresář nastavit pomocí funkce ude-user-set-root-directory (C-c C-p C-r) nebo pomocí příslušné funkce tlačítko na panelu nástrojů.

Po zadání kořenového adresáře lze pomocí funkce ude-generate-makefile (C-c C-ca nebo C-c C-c C-l) vygenerovat Makefile, který uživatele vyzve k zadání názvu spustitelného souboru, do kterého bude daný zdrojový kód uložen. sestaven. Pokud již Makefile existuje, pak tyto stejné klávesové zkratky jej aktualizují a také znovu sestaví soubory .afile a .etags. Kromě toho existuje sada funkcí pro editaci Makefile - ude-edit-makefile (C-c C-c e), aktualizaci Makefile - ude-update-makefile (C-c C-c u), přepínání mezi ladicí a vydanou verzí programu - ude- makefile-debug-mode (C-c C-c C-d) & ude-makefile-final-mode (C-c C-c C-f) a další.

Jakmile Makefile existuje, je možné zkompilovat kód pomocí funkce ude-mode-compile-from-menu (C-c C-c C-c). Kompilaci můžete přerušit pomocí funkce kill-compilation (C-c C-ck).

A po dokončení kompilace můžete spustitelný soubor spustit pomocí funkce ude-execute (C-c C-c C-r).

Ladění a profilování

Balíček Bigloo také přichází s debuggerem, který umožňuje ladění na úrovni zdrojového kódu. včelí režim podporuje interakci s tímto debuggerem v Emacsu. Chcete-li spustit debugger, musíte provést funkci ladění včel (C-c C-b C-b) nebo vybrat příslušnou ikonu na panelu nástrojů nebo položku nabídky. Ale spuštění ladicího programu se k němu automaticky nepřipojí, takže musíte explicitně provést funkci bee-toggle-connect-buffer (C-c C-b c), abyste navázali aktuální vyrovnávací paměť na ladicí program, což vám umožní nastavit body přerušení a provádět další úkoly. ve vyrovnávací paměti zdrojového textu.

Profilování programu je podporováno automaticky, pokud používáte generování Makefile. Chcete-li profilovat kód, musíte jej nejprve zkompilovat s podporou profilování, což se provádí pomocí funkce bee-profiler-start (C-c C-p c). A po kompilaci můžete spustit bee-profiler-inspect (C-c C-p i), který spustí program, a poté spustit obslužný program bglprof, který bude shromažďovat data o provedení, abyste je mohli analyzovat.

Další funkce

Balíček poskytuje příležitosti k přijetí referenční informace. To lze provést spuštěním funkce bee-doc-visit (C-c C-d i) nebo kliknutím na ikonu Info na panelu nástrojů. Tato funkce se chová odlišně v závislosti na aktuální pozici kurzoru - pokud je kurzor na identifikátoru, pak se zobrazí dokumentace k tomuto identifikátoru, pokud je vybrána oblast kódu, bude vydána dokumentace pro tuto oblast. V opačném případě bude uživatel vyzván k zadání názvu sekce dokumentace, která ho zajímá, a zobrazí se vybraná sekce.

Informace zobrazené uživateli jsou převzaty z informačních souborů, které se dodávají s Bigloo. Dokumentace se navíc vyhledává v adresářích aktuálního projektu a automaticky se přidávají. Kromě toho může uživatel zadat další soubory dokumentace, které se mají prohledávat.

Plastová taška bmacs poskytuje také řadu funkcí pro práci se systémy správy verzí, které umožňují pracovat s daty na úrovni projektu. Ale vzhledem ke vzniku nových systémů pro správu verzí a odpovídajících rozhraní pro ně nejsou tyto funkce příliš žádané.

Kromě toho existuje mnoho dalších funkcí implementovaných tímto balíčkem, například podpora práce s kódem napsaným v jazyce C atd., ale popis těchto schopností je nad rámec tohoto článku.

Podpora schématu ve SLIME

K použití SLIZ se Scheme, musíte provést základní nastavení balíčku, jak je popsáno v sekci balíčku, a poté stáhnout požadované komponenty. V celkový pohled to se dělá následovně:

(add-hook "slime-load-hook (lambda() (vyžadovat "slime-scheme)))

Tento příkaz nainstaluje háčky potřebné pro práci SLIZ, ale pro každý podporovaný dialekt budete možná muset provést další konfiguraci podle pokynů v příslušném souboru - swank-kawa.scm nebo swank-mit-scheme.scm .

A vše ostatní, co souvisí s prací SLIZ, popsané v příslušné části.

Ve výchozím nastavení je povolen pouze jeden běžící proces Systém. Balíček však můžete použít, pokud potřebujete spustit několik procesů současně.

Navíc dodávka bmacs k dispozici také balíčky cee, navržený pro úpravu kódu C používaného k psaní rozšíření Bigloo, bug-mode, který poskytuje podporu pro ladicí program Bigloo, a ude(Unix Development Environment), která implementuje podporu kompilace, a různé utility, používaný při práci s Bigloo.

Stojí za zmínku, že pokud Makefile neexistuje, pak tato funkce způsobí, že kompilace spustitelného modulu začne z jednoho souboru.

Tzv švihnout-modul.

Všechny komponenty související se Scheme jsou umístěny v podadresáři contrib distribuce SLIME, tak si ho nezapomeňte přidat do svých vyhledávacích cest.

Jaký jazyk si vybrat pro výuku programování?Neměli byste se začít učit programování někde uprostřed.

Nejprve musíte trénovat svůj mozek, schopnost vytvářet algoritmy a popisovat je, znát možnosti konkrétního jazyka. Na tuzemských školách a univerzitách obvykle studují programování Základní příklad nebo Pascal. Až dosud je Pascal považován za jednoho z nich nejlepší jazyky pro trénink je to přísná řeč se statickým psaním, která umožňuje bez zbytečné problémy procvičit principy procedurálního a objektově orientovaného programování. Ale po seznámení se vzdělávacími materiály předních Západní univerzity(Berkeley, Stanford, MIT), souhlasím, že by bylo dobré začít se učit s jedním z funkčních jazyků.

Vlastně docela zvláštní, ale funkční paradigma domácím školstvím tvrdošíjně ignorován. K překlenutí této mezery bych rád hovořil o programovacím jazyce Scheme.

Scheme je velmi jednoduchý programovací jazyk. Je docela možné se to naučit za jeden den, ale tato jednoduchost klame. Schéma je také velmi silný jazyk. Existuje obrovské množství implementací.

Certifikační programy jsou uloženy v souborech *.scm, nebo můžete použít interaktivní režim interpret, podobný Pythonu.

Konstanty a proměnné

Začněme se učit základní struktury Scheme. Nejprve si definujme konstanty:

123 – celé číslo

3,1415926 - zlomkové číslo

2 + 3i - komplexní číslo

2/3 - zlomek

#B1111 - binární číslo

#xFF - hexadecimální článek

# O123 - osmičkové číslo

#\A - jeden znak

"Ahoj Světe!" - Řetězec znaků

"Ahoj - symbol."

#f - logická hodnota

Konstanty lze ovládat pomocí operátorů nebo funkcí. Scheme je totiž funkční jazyk, takže má všechny funkce.

V matematice znáte formu zápisu funkcí f (x) nebo t (a, b). Ale totéž lze napsat ve tvaru (f x) nebo (t a b). Toto je přesně forma nahrávání, kterou Scheme používá. Ne jako aritmetický výraz, které se píší ve tvaru například 2 + 3 a v předponě - (+ 2 3).

Například:

klam> (+ (* 3 4) (/ 5 2))

29/2

klam> (+ 1 1 1 1 1)

lst> (/2)

podvod> (sqrt 2)

1.4142135623731

Chcete-li deklarovat proměnné, použijte konstrukci (definujte název hodnoty)

podvod> (definujte 2)

lst> (definujte b 2)

lst> (+ a b)

Hodnotu již existující proměnné lze změnit pomocí konstruktu (set! name value)

lst> (set! a 5)

lstivost>a

Funkce jsou deklarovány pomocí konstruktu (definovat (název parametru) typ_funkce)

podvod> (definovat (čtverec x) (* x x))

lst> (čtverec 3)

Abych demonstroval rekurzi, uvedu příklad výpočtu faktoriálu:

(Definovat (fakt x)

(Pokud (= x 1)

(* X (skutečnost (- x 1)))))

Jak jste již pochopili, stav lze zkontrolovat pomocí konstrukce (pokud je stav jakýmkoli způsobem)

Aniž bych zacházel do podrobností, upozorním na hlavní funkce

(Zobrazení "Hello, World!") - Zobrazení řetězce

(Nový řádek) - přechod na nový řádek

Pro práci s datovými sadami je vhodné používat seznamy

guile> (definovat nums (seznam 1 2 3 4 5 6 7 8 9 10)) - deklarovat seznam

guile> (list-ref nums 0) - čtení prvku s číslem 0

guile> (čísla vozu) - přečtěte si první prvek

guile> (cdr nums) - přečtěte si všechny ostatní prvky

(2 3 4 5 6 7 8 9 10)

Všechny prvky seznamu můžete zpracovat najednou

generovat nový seznam aplikací funkce pro každý prvek

podvod> (čísla na mapě)

(1 4 9 16 25 36 49 64 81 100)

guile> (mapa (lambda (x) (* x 3)) nums)

(3 6 9 12 15 18 21 24 27 30)

Konstrukce lambda vám umožňuje deklarovat funkce podle potřeby, aniž byste jim dávali jména. Pokud programujete v Pythonu, tyto konstrukce již znáte.

Ve skutečnosti Scheme nemá smyčky jako v imperativních jazycích. Zde se pro stejné účely používá rekurze. Zobrazme například obsah seznamu ve sloupci

(Definovat (tisk-list lst)

(Pokud (ne (null? Lst))

(Začít (zobrazit (auto lst))

(nový řádek)

(Print-list (cdr lst)))))

Konstrukce (begin ...) se používá, pokud potřebujete vložit několik operátorů, kde syntaxe umožňuje pouze jeden.

Následující konstrukce umožňuje simulovat smyčku for známou z jiných programovacích jazyků:

(Nechte smyčku ((i 1))

(Zobrazení i)

(nový řádek)

(Pokud (<= i 10) (loop (+ i 1))))

Konstrukce let se používá, když potřebujete deklarovat lokální proměnné ve výrazu nebo když potřebujete deklarovat vnořenou funkci. Tímto způsobem lze implementovat téměř všechny možné možnosti cyklu. Samozřejmě si vždy můžete vytvořit vlastní funkci pro zkrácení zápisu, protože funkce lze předávat jako parametry jiným funkcím, stejně jako jednoduchá data. Obecně vám Scheme umožňuje upravit jazyk podle vašich představ. Úžasně flexibilní jazyk.

Můžete například uvést implementaci funkce pro výpočet určitého integrálu

(Definovat (func x)

(Definujte (integrujte a b e f)

(definujte součet 0)

(Nechte smyčku ((i a))

(Pokud (

(Nastavit! Součet (+ součet (* (f i) e)))

(Smyčka (+ i e)))))

Součet)

(Zobrazení (integrace 0 1 0,01 func))

(nový řádek)

Oficiální webové stránky Guile

Schemers.org

Videonahrávky přednášek kurzu The Structure and Interpretation of Computer Programs na Berkeley University

Obecně, protože Scheme je akademický jazyk, je o něm mnoho informací. Znalost tohoto jazyka vám zároveň umožní nejen nový pohled na různé konstrukce v jiných jazycích (jako je například Python).

Zavedení

Systém- funkcionální programovací jazyk, jeden ze dvou nejznámějších dialektů jazyka v naší době Lisp. Chlap L. Steele A Gerald Jay Sussman z Massachusetts Institute of Technology ( MIT) - vytvořil ji v polovině 70. let 20. století. Přesně Systém se používá již dlouhou dobu v MIT pro výuku programování (nyní nahrazeno Krajta) a přesně dál Systém příklady jsou zapsány ve slavné knize "Struktura a interpretace počítačových programů"- bible každého programátora, který si sám sebe váží.

Pro IDE Zatmění existuje plugin, který vám umožní programovat Systém. V tomto článku se podíváme na hlavní funkce tohoto pluginu, prostudujeme proces jeho používání a postup konfigurace.

Plugin se nazývá SchemeScript a je součástí projektu SchemeWay. Nejnovější verzi tohoto pluginu si můžete stáhnout z webu (po stažení stačí zkopírovat jar soubor do katalogu eclipse/pluginy). Projekt se aktivně vyvíjí, nejnovější verze se nazývá 1.3.0 alfa10 a zveřejněno 05.09.2010 Zdrojový kód je dostupný na GitHub. Další informace o pluginu, některé triky, které umožňuje SchemeScript, a jeho možnosti najdete na blogu Dominique Boucher- autor tohoto rozšíření.

Za zmínku stojí i nejnovější verze SchemeScript nefunguje v Eclipse Helios, takže zatím k rozvoji v jazyce Systém by měl být použit Eclipse Galileo.

UPD 17.07.2010: Nejnovější verze na GitHubu funguje Eclipse Helios, ale je třeba jej sestavit ze zdrojů. Po nějaké době Dominic slíbil, že distribuci přestaví.

Zatmění-perspektivní Systém

Po instalaci pluginu bude dostupný Zatmění-perspektivní Systém. Ve výchozím nastavení to vypadá takto:

Perspektiva zahrnuje pohled (v termínech Zatmění) projektový navigátor - Navigátor, pohled zobrazující analyzovaný obsah upraveného souboru - Obrys, který zobrazí seznam definic konstant a funkcí a také dva sbalené pohledy: pohled s ikonou ve tvaru písmene lambda - Definice a pohled Utěšit.

Do hlavního menu Zatmění přidána skupina příkazů Systém, určený především k ovládání tlumočníka. Panel rychlého spuštění obsahuje tři tlačítka (vybavená ikonami ve tvaru písmene lambda), zleva doprava: spuštění tlumočníka, restart tlumočníka a zastavení tlumočníka.

Než začnete pracovat s editorem, musíte vytvořit Projekt Eclipse, který bude ukládat soubory zdrojového kódu. Specifické pro Systém plugin typu projektu SchemeScript neposkytuje, takže musíte vytvořit běžný projekt z adresáře Generál:

Vytvořený projekt se zobrazí v navigátoru:

Nyní v projektu můžete provést Nový -> Soubor a vytvořte soubor určený k uložení zdrojového kódu Systém. Tento soubor musí mít příponu .ss nebo .scm. Soubory s těmito příponami budou upravovány pomocí speciálního editoru, který je součástí balení SchemeScript.

Editace zdrojového kódu

SchemeScript poskytuje editor zdrojového kódu pro daný jazyk Systém s poměrně bohatými možnostmi. Pojďme se na ně podívat blíže.

V první řadě stojí za zmínku zvýraznění párových závorek. Při úpravě kódu na Lisp-stejně jako jazyky je tato vlastnost nezbytná, protože v každé více či méně složité konstrukci se člověk může splést, která otevírací závorka odpovídá které uzavírací.

Editor obsahuje vestavěný Analyzátor správnosti S-výrazů. Pokud je například vynechána koncová závorka, vygeneruje se chybové hlášení:

Existuje i taková užitečná věc jako autosubstituce nebo doplnění výrazu. Tedy pokud stisknete při psaní Ctrl+Mezerník, poté vyskočí okno s dostupnými možnostmi pro dokončení zadané struktury:

Při vytváření definic (například pomocí klíčového slova definovat) jsou přidány do zobrazení Obrys, která vám v případě potřeby umožní rychlý přístup k požadované definici:

Plugin SchemeScript přidá dvě skupiny položek do kontextové nabídky editoru kódu: Zdroj- obsahuje příkazy pro úpravu zdrojového kódu - a Eval- obsahuje příkazy pro jeho interpretaci:

Zvažte skupinu položek nabídky Zdroj:

Najít definici- hledá definici symbolu ve zdrojovém kódu. To znamená, že se například musíme podívat na to, jak je symbol definován sqr. Chcete-li to provést, umístěte kurzor za tento znak

a stiskněte F12. Kurzor se přesune na definici funkce sqr a tato definice bude zvýrazněna:

Kompletní symbol- s tímto příkazem jsme se již seznámili;

Popište symbol- zobrazí nápovědu s popisem symbolu. Například symbol, který jsme uvažovali v předchozím příkladu sqr je funkce:

Vložit komentář do záhlaví- přidá globální komentář na začátek souboru zdrojového kódu. V nastavení (viz níže) si můžete definovat některá pole pro takový komentář – autor, autorská práva atp.

Vložte komentář ke kapitole- přidá komentář k určitému bloku kódu - soubor funkcí a definic.

Vložit komentář k sekci- přidá komentář ke konkrétní funkci nebo definici.

Přepnout komentář- okomentovat/odkomentovat vybraný blok kódu. Pokud blok kódu není komentář, přidají se k němu úvodní znaky ";":

A v souladu s tím i naopak - pokud je nějaký výraz zakomentován, symboly komentáře se odstraní:

Komprimujte prostory- odstraní nadbytečné předchozí a následující mezery a nové řádky. Něco jako funkce oříznout:

Formát- naformátuje kód v souladu se zadaným nastavením. Odsadí, odstraní nadbytečné mezery a zalomení řádků.

Kód před formátováním

Kód po formátování

Vyměňte S-výrazy- změní pořadí S-výrazů stejné úrovně vnoření. Pokud například v předchozím příkladu provedete tento příkaz, pak seznam A lambda vyměnit místa:

Na místě Systém hlavní menu Zatmění obsahuje příkaz Najít symbol schématu(k dispozici také na Ctrl+F12). Když zavoláte tento příkaz, zobrazí se dialogové okno, které vám umožní rychle najít definici požadované funkce. Například máme funkci definovanou v souboru zdrojového kódu sqr, respektive, pokud je v terénu Zadejte předponu symbolu: zadejte dialogové okno sq, pak v terénu Odpovídající symboly objeví se funkce definovaná v kódu sqr:

Pokud z oboru Odpovídající symboly vyberte tuto funkci, kurzor v editoru se automaticky přesune na místo, kde je definována. Předpokládejme, že máme několik souborů se zdrojovým kódem a v každém je definována funkce sqr. Pak je potřeba kromě samotné funkce také vybrat soubor. Pro tento účel použijte formulář Definice, ve kterém se po výběru funkce umístí informace o možnostech její definice z různých souborů:

Výklad

Když je kód napsán, chcete jej zkontrolovat například spuštěním na interpretu Systém. Plugin SchemeScript poskytuje příležitosti i k tomu. Nejprve k tomuto bodu Systém hlavní menu Zatmění, obsahující příkazy pro výběr požadovaného interpretu a jeho ovládání: start, restart a stop (nutné, pokud aplikace zamrzne např. věčná smyčka. Protože Systém může optimalizovat rekurzi ocasu, věčná smyčka je skutečně věčná).

Obrázek ukazuje možnosti výběru tlumočníka. Za prvé toto - Externí tlumočník- připojuje externí interpret nainstalovaný na stejném počítači jako Zatmění. Tlumočníci Systém teď hodně, pod Windows můžete použít např. Schéma Chez.

Zabudovaná Kawa- součástí dodávky SchemeScript tlumočník Kawa. Vyvíjí se pod záštitou GNU na Jáva rámec pro implementaci vysokoúrovňových a dynamických jazyků, z nichž je kód kompilován Bytový kód Java. Usnadňuje použití v kódu Systém třídy Java a proto dobrý jako skriptovací jazyk. Kromě interpretru obsahuje i kompilátor, který umožňuje jeho použití jako plnohodnotného jazyka pro JVM jak se používají Scala, Báječný A Clojure. Někteří nadšenci používají Kawa pro vývoj aplikací běžících na platformě Android.

Vzdálený tlumočník- umožňuje vybrat speciální server běžící na jiném počítači jako interpret. Například v ústavu můžete při výuce programování nastavit speciální server, který umí interpretovat Systém-kód. Interakce SchemeScript a tento tlumočník bude proveden po síti.

Tlumočník SISC- vestavěný REPL z Druhý vykladač schémat- zapsáno v Jáva tlumočník Systém.

Například po výběru běžícího tlumočníka Kawa, musí být spuštěn pomocí příslušného příkazu nabídky nebo tlačítka z panelu Snadné spuštění:

Skupina příkazů se používá přímo k odesílání částí kódu k interpretaci Eval z kontextové nabídky editoru kódu:

Tato skupina obsahuje následující příkazy:

Eval špičkový výraz- spustit výraz nejvyšší úrovně vzhledem k výrazu, ve kterém se nachází kurzor. Pokud je kurzor před poslední uzavírací závorkou - viz obrázek

a tento příkaz se provede, definice funkce se načte do interpretu sqr.

Eval předchozí výraz- vykoná předchozí výraz vzhledem ke kurzoru. Pokud v příkladu

provedete tento příkaz, výraz bude načten do interpretu (* x x), kterou nebude moci splnit, protože parametr x není definováno:

Načtěte soubor v aplikaci Interpreter- načíst soubor do interpretu, tzn. spustit celý obsah souboru v interpretu.

Podívejme se na příklad: existuje kód pro funkci, která počítá n- e Fibonacciho číslo. Chceme vypočítat čtvrté Fibonacciho číslo:

Pokud spustíte příkaz Eval předchozí výraz po (fib 4), pak se vygeneruje chyba: interpret nezná definici funkce fib:

Pokud spustíte příkaz Načtěte soubor v aplikaci Interpreter a pak - Eval předchozí výraz, pak výpočet proběhne správně:

Podpora Kawa REPL

Read-eval-print loop (REPL)- jednoduché interaktivní programovací prostředí, v tomto prostředí může uživatel zadávat výrazy, které budou okamžitě vypočteny a výsledky výpočtu se zobrazí uživateli.

V ceně Kawa takové prostředí je zahrnuto. Můžete například definovat funkci přímo v konzole se spuštěným interpretem součet a vypočítat jeho hodnotu vzhledem k některým argumentům (každý řádek je považován za jeden výraz):

Navíc je tu i výhled Kawa Stack Trace, který umožňuje sledovat stav zásobníku volání při ladění. Abychom pochopili, jak ji používat, simulujme chybu, například zavolejte funkci, která vypočítá druhou mocninu čísla z argumentu "ss":

Kawa nebude schopen vyhodnotit hodnotu tohoto výrazu a zobrazí chybu převodu typu:

Trasování zásobníku bude vypadat takto:

Pokud je stisknuto ve formuláři Kawa Stack Trace tlačítko Zobrazit pouze rámce schématu, pak se zobrazí úplný stacktrace, včetně výjimečných situací v zapsaném kódu Jáva, a nejen na Systém:

Nastavení

Plugin SchemeWay je poměrně flexibilní rozšíření pro vývojové prostředí Zatmění. Abyste pochopili všechny jeho možnosti, měli byste určitě zvážit nastavení. Strom nastavení začíná skupinou Systém:

Na stránce Systém K dispozici jsou následující nastavení:
- Zobrazená karta s- umožňuje nastavit šířku (v mezerách) pro zobrazení znaku tabulátoru. To funguje pouze v případě, že tým obvykle nenahrazuje tabulátory mezerami.
- Povolit strukturální úpravy- zaškrtávací políčko je zodpovědné za zapnutí/vypnutí strukturovaného editoru Systém. Strukturovaný editor nepracuje se symboly, ale s celými S-výrazy. Tito. Podle backspace, například bude celý S-výraz smazán najednou. Také při otevření závorky se okamžitě přidá párová uzavírací.
- Uložit... A Zatížení... umožňují uložit a naopak - načíst - nastavení SchemeScript do/z .epf-soubor/a.

Strana Vzhled odpovídá za vzhled editoru. Umožňuje nastavit barvu, kterou bude spárovaná závorka zvýrazněna (skupina Shodná závorka), barva pozadí editoru (skupina Pozadí) a barvy použité pro zvýraznění syntaxe (skupina Popředí).

Obrázek výše ukazuje příklad nastavení modré barvy pro řetězcové konstanty.

Strana Komentáře je zodpovědný za zobrazování komentářů. Obsahuje následující nastavení:
- Předpona pro komentáře- prefix, kterým bude komentář začínat. Ve výchozím nastavení - dva středníky ( ;; ).
- Obsah pole autora- obsah pole Autor, umožňuje zadat jméno/příjmení autora kódu.
- Obsah pole pro autorská práva- obsah pole Copyright vám umožňuje zadat informace o autorských právech.
- Automaticky pokračovat v komentáři z předchozího řádku- pokud je toto zaškrtávací políčko zaškrtnuté, pak když stisknete Vstupte po komentáři na novém řádku bude komentář pokračovat, tzn. nový řádek bude začínat ;; .

Strana Rychlé klávesy Eval umožňuje zadat příkazy (tj. jména Systém-funkce), které budou provedeny po stisknutí odpovídajících kombinací klávesnice. Standardně pro všechny Rychlé vyhodnocení klíč 0...9 odpovídá kombinaci kláves Alt-K, 0...9. Při aktivním používání pluginu si každý vývojář vytvoří sadu názvů metod, které neustále volá (například metoda test, spustit nějaký testovací kód). Volání těchto metod lze tedy přiřadit klávesovým zkratkám.

Strana Odsazení slouží ke konfiguraci odsazení přidaných při psaní/formátování kódu. Pro každé klíčové slovo můžete určit nastavení odsazení použité na jeho argumenty. Tabulka nastavení je uspořádána následovně: ve sloupci Symbol je zadáno klíčové slovo, pro které jsou nakonfigurovány odrážky. Sloupec Schéma odsazení určuje schéma odsazení. Schémata jsou následující:
- výchozí- všechny podvýrazy jsou zarovnány pod první znak svého okolního výrazu.
- definice- všechny podvýrazy jsou zarovnány jako rámovací výraz + 2 mezery (podobně jako u návrhu formuláře definovat).
- -li- všechny podvýrazy jsou zarovnány jako rámovací výraz + 4 mezery (podobně jako u návrhu formuláře -li).
- žádný- žádné odsazení, všechny podvýrazy jsou zarovnány stejným způsobem jako okolní výraz.
- s- nejsložitější forma zarovnání, používaná pro funkce s dlouhými názvy a/nebo velkým seznamem parametrů. První N-parametry jsou odsazeny 4 mezerami, zbytek - 2 mezerami Náznak nastaví hodnotu N. Příkladem použití tohoto formuláře je zarovnání klíčových slov nechat:

Strana Tlumočník umožňuje nastavit nastavení pro interpretaci kódu a analýzu. Dosud existují dvě taková nastavení: - pokud je zaškrtávací políčko zaškrtnuté, pak bude soubor před odesláním k interpretaci uložen. Vyhnete se nutnosti pamatovat na uložení změn před jejich interpretací.
- Prostorové výrazy s (začít...)- zda se mají interpretované výrazy ve formuláři rámovat (začít...). Pokud tomu dobře rozumím, tato možnost je nezbytná pro práci s některými interprety, které mohou provádět pouze jeden S-výraz najednou.

Strana Externí tlumočník umožňuje určit externí interpret, který se má použít. Můžete nastavit následující možnosti:
- Jméno tlumočníka- jméno tlumočníka
- Příkazový řádek- příkazový řádek, včetně úplné cesty k interpretu a některých voleb, které potřebuje, aby fungoval.
- Pracovní adresář- pracovní adresář tlumočníka je adresář, ke kterému bude vypočítávat cesty k souborům.
- Chyba Regexp- regulární výraz pro analýzu chyb. Interpret vytváří chybové zprávy v některých svých vlastních formátech, SchemeScript musí vědět, jak z tohoto řádku s chybami vytáhnout informaci o umístění chyby ve zdrojovém kódu. Například pro Kawa Tento regulární výraz je: [\t ]+zavináč [^(]+\(((.+):(+))\).

Obrázek výše ukazuje externí tlumočník spuštěný v konzole chez-schéma.

Strana Vzdálený tlumočník obsahuje nastavení pro připojení ke vzdálenému interpretu - interpretu běžícímu jako server a naslouchajícímu konkrétnímu portu. V souladu s tím vám tato stránka umožňuje zadat název hostitele a port, na kterém běží tento vzdálený interpret.

Strana Lexikální rozšíření slouží ke správě lexikálních rozšíření Systém. Obsahuje dvě položky:
- Se závorkami ( nebo ()) zacházejte jako s rodiči- zda zacházet se složenými a hranatými závorkami stejně jako s kulatými. Tito. zda zvýraznit pár a zda ovládat párování závorek.
- Přijměte pomlčku (#) jako část identifikátoru- zda povolit použití symbolu hash jako součásti názvu identifikátoru (jak tomu rozumím, nefunguje to pro všechny interprety Systém).

Poslední stránka - Syntax- umožňuje flexibilně řídit zpracování syntaxe jazyka - přidávat a odebírat struktury ze skupin, což ovlivňuje zvýraznění syntaxe při úpravách. Na této stránce je definováno 5 skupin:
- Definovat- definice obsahují klíčová slova, kterými definice začínají, např. definovat.
- Zvláštní jména- speciální pojmenované parametry, jako např #!klíč nebo #!odpočinek.
- Speciální formuláře- speciální formy, jako např -li, a, nechat atd. Ve skutečnosti - hlavní část klíčových slov programovacího jazyka.
- Mutátor- mutátory, tzn. funkce, které mění stav. Jsou zvýrazněny jinak než funkce, které nemění stav.
- Konstantní- konstanty jako např #!eof, #!nula atd. Můžete také přidat #t A #F.

Do každé skupiny můžete přidat své vlastní prvky a také odstranit stávající. To je velmi výhodné při vývoji vlastního DSL na základě Systém a pracovat s ním v editoru. Kromě explicitního přidávání variant můžete v rámci každé skupiny určit regulární výraz, který odpovídá jejím členům.

To se stane, pokud jej přidáte do skupiny Definovat klíčové slovo pavel:

Závěr

Podívali jsme se na funkcemi bohatý a vysoce přizpůsobitelný nástroj pro vývoj v programovacím jazyce Systém v prostředí Zatmění. Tento nástroj umožňuje upravovat zdrojový kód a komunikovat s celou řadou interpretů, včetně vestavěných a vzdálených. Pokud porovnáme možnosti tohoto pluginu s vývojovými nástroji na Systém, například pod Emacs, pak jsou celkem srovnatelné (až na absenci takových maličkostí, jako je nahrazení klíčového slova lambda k symbolu řeckého písmene lambda). Každý programátor, který nechce ovládat Emacs lze použít Zatmění začít s funkcionálním programováním nebo jazykem Systém, stejně jako pro řešení problémů a cvičení z SICP. Také možná někoho bude zajímat téma development on Systém pod JVM pomocí Kawa.

Chtěl bych poděkovat autorovi SchemeScript - Dominique Boucher, který tuto utilitu vyvíjí zdarma. Za zmínku stojí, že plugin SchemeScript je projekt s otevřeným zdrojovým kódem a každý programátor může pomoci s jeho vývojem přidáním funkcí, které potřebuje.

Z.Y. Vyvstala myšlenka, že totéž Systém je těžké studovat, protože to není zajímavé - nejsou tam žádné zajímavé úkoly. Běžné matematické výpočty jsou nezajímavé a i jednoduchá práce například s grafikou vyžaduje platformu a knihovny. Je zajímavější učit se jazyk tím, že jej aplikujete na nějakou předmětovou oblast. Tak, SchemeScript + Kawa + Eclipse lze použít jako výukovou platformu. Viz příklady z SchemeScript(v souboru jar adresář příklady), jsou tam docela zajímavé.

Jako obvykle můžete zanechat své komentáře nebo klást otázky programátorovi Severe Chelyabinsk.

Líbila se mi zpráva -




Nahoru