2 hoofdkenmerken van de schemataal: recursie. Schema programmeertaal. GNU Guix is ​​een nieuwe pakketbeheerder van het GNU-team

Scheme, ook bekend als Lisp (niet te verwarren met Common Lisp), is een moderne algoritmische programmeertaal, beroemd om zijn focus op het functionele programmeerparadigma, maar beperkt zich er niet toe.

De Lisp-familie is de op één na langst bestaande talenfamilie (na Fortran), opgericht door John McCarthy als schrijfinstrument. kunstmatige intelligentie. Een van de actieve deelnemers aan de ontwikkeling gespecialiseerde computers om Lisp te interpreteren was Richard Stallman, later de oprichter van de Free Software Foundation. Als gevolg hiervan is Emacs (+Geiser, Scheme-Complete, bedrijfsmodus) een van de belangrijkste tools voor ontwikkeling in Scheme. Er wordt verwacht dat Scheme op een gegeven moment een interne taal van Emacs zal zijn, in plaats van Emacs Lisp. (Je kunt het nu bekijken op EdWin.)

Scheme is een Lisp gericht op het gemak van portabiliteit, een functionele benadering en de implementatie van best practices uit de programmeertaaltheorie.

Het schema ontwikkelt zich op twee manieren. Individuele uitbreidingen worden geformuleerd volgens een proces dat vergelijkbaar is met RFC's en worden SRFI's (Scheme Request For Implementation) genoemd. Binnen het toegewezen tijdsbestek worden gezamenlijke edities van het “standaardrapport” gepubliceerd, waarin wordt geformuleerd wat het schema “als geheel” is. De laatst voltooide editie is Revised 7 Report on Algorithmic Language Scheme (kleine taal), en de nieuwste experimentele editie is R7RS-large Red Edition. Er wordt verwacht dat er zeven of acht tussentijdse edities zullen zijn voordat de laatste editie van R7RS-large wordt uitgebracht dit moment Er wordt gedacht aan editie 2 (Tangerine), die tot doel heeft datastructuren, verzamelingen en numerieke gegevens te formaliseren, en editie 3, gericht op nieuwe features.

Geïnteresseerde specialisten worden uitgenodigd om het discussiemateriaal te bestuderen en te stemmen op basis van hun eigen visie op de problematiek, nadat zij zich vooraf hebben voorgesteld [e-mailadres beveiligd]

  • Snaarbibliotheek
  • Associatieve arrays
  • Normale uitdrukkingen
  • Generatoren/batterijen
  • gehele bewerkingen
  • Bit-operaties
  • Wiskundige bewerkingen met fixpoint
  • Wiskundige bewerkingen met drijvende komma
  • Bit-vectoren
  • Homogene vectoren
  • Opmaak
  • Grote getallen
  • Breuken
  • Exacte cijfers

Vragen die in de derde editie aan de orde komen:

  • Willekeurige nummers
  • priemgetallen
  • Gehele getallen
  • Discretionaire statistieken
  • Bereiken
  • Bit-vectoren
  • Bytereeksen
  • Overdrachten
  • Combinatoriek en permutaties

Anoniem (28-11-2018 23:36:26 PM)

MIT/GNU Scheme is een implementatie van de taal Programmeerschema, dat een tolk, compiler, broncode-debugger, ingebouwde Emacs-achtige editor en een grote runtime-bibliotheek biedt. MIT/GNU Scheme is op maat gemaakt voor programmeren grote toepassingen met een snelle ontwikkelingscyclus.

Veranderingen:

  • Assemblages voor Ramen meer worden niet gedistribueerd omdat bestaande 32-bit builds van weinig nut zijn voor moderne systemen, en het bereiken van 64-bit functionaliteit aanzienlijke inspanningen vergt, waarin geen van de huidige beheerders geïnteresseerd is.
  • macOS is nu alleen beschikbaar in 64-bits builds, omdat ondersteuning voor 32-bits builds in recente tooling-releases is verouderd.
  • De draagbare C-versie is niet opgenomen in deze release omdat deze niet op tijd kon worden gerepareerd.
  • Er zijn een aantal kleine verbeteringen gepland voor de volgende release; De eerste prioriteit voor deze release is innovatie.

Belangrijke innovaties:

Meer wijzigingen:

  • initiële SMP-ondersteuning;
  • meldingen van afvalverzamelaars;
  • draadgebeurtenissen;
  • vele andere kleine innovaties en oplossingen.

Incompatibele wijzigingen:

Experimentele nieuwe functies:

  • Het URI-type heeft een nieuwe syntaxis: #<...>. Zowel lezers als schrijvers werken met deze syntaxis.

GNU Guile 2.9.1 (bèta)

Guile is een implementatie van de GNU Scheme-programmeertaal, ondersteunt veel SRFI's, implementeert de R5RS-standaard en biedt een modulair systeem, volledige toegang tot systeemoproepen POSIX, ondersteuning voor netwerken, threads, dynamische binding, externe functieaanroepen en krachtige stringverwerking. Guile kan code interactief interpreteren en in bytecode compileren virtuele machine en zelfs verbonden worden door de bibliotheek als een tolk die in de applicatie is ingebouwd.

2.9.1 is de eerste bèta-release van de branch die zich voorbereidt op de stabiele release 3.0. Vergeleken met de huidige stabiele tak (2.2.x), voegt het JIT-compilatie toe, waardoor alle Guile-programma's tot 4 keer sneller worden. In deze release wordt JIT alleen ondersteund op x86-64; Toekomstige releases zijn van plan om alle platforms te ondersteunen die door GNU Lightning worden ondersteund.

GNU Guile-CV 0.2.0

Guile-CV is een bibliotheek computer visie voor de GNU Guile-programmeertaal, die een binding is met de Vigra-bibliotheek, geschreven in C++ en werkt via de Vigra C-laag, is Guile een implementatie van de Scheme-taal, een dialect van Lisp.

Programmeertaal Racket 7.0 uitgebracht

GNU Guile-CV 0.1.9

Guile-CV is een computervisiebibliotheek voor de GNU Guile-programmeertaal, die een binding is met de Vigra-bibliotheek geschreven in C++ en door de Vigra C-laag loopt. Guile is een implementatie van de Scheme-taal, een dialect van Lisp.

Wijzigingen sinds versie 0.1.8:

  • Bijgewerkte afhankelijkheden. Compatibiliteit wordt nu ondersteund met Vigra C vanaf commit a2ff675f4 en hoger, als gevolg van veranderingen in januari van dit jaar: het argument in de vigra_nonlocalmean_c interface is hernoemd, het out-of-bound strategieargument is toegevoegd aan de vigra_medianfilter_c functie.
  • Nieuwe interfaces: im-mediaan-filter , im-mediaan-filter-kanaal , im-nl-betekent , im-nl-betekent-kanaal .
  • Correcties: in de module (cv-ondersteuning latex) die latex-pdftoppm gebruikt - een ongedocumenteerde maar zeer nuttige procedure voor het voorbereiden van tekst voor het toevoegen aan afbeeldingen - werd het optionele argument met het trefwoord [#:res 72] niet daadwerkelijk gebruikt, dit is nu opgelost.

Kwam uit een nieuwe versie 0.2.3 van het GNU Artanis-webframework in Scheme-taal

Het raamwerk is geschreven in een implementatie van de Scheme-taal - Guile Scheme en is bedoeld voor het creëren van dynamische websites, webapplicaties, webservices en webbronnen.

Het raamwerk biedt ook tools voor het werken met de database, sjablonen, sessies, caching, URL-hertoewijzing voor RESTful, enz.

De naam Artanis zelf komt van het omgekeerde van Sinatra, een Ruby-webframework.

Artanis is vergelijkbaar met webframeworks zoals Ruby Sinatra, Python Flask en Java Spark.

De naam van de hoofdontwikkelaar is Nala Ginrut, opnieuw van de achterkant van Alan Turing.

Guile-Ncurses 2.0

De release van guile-ncurses 2.0 vond plaats - een bibliotheek voor het maken van tekstgebruikersinterfaces op GNU Guile, waarmee de functionele programmeertaal Scheme werd geïmplementeerd. guile-ncurses is een verpakking voor de Ncurses-bibliotheek.

GNU Guile 2.0.10 uitgebracht

GNU Guile is een project om een ​​gratis implementatie te ontwikkelen van de functionele programmeertaal Scheme, die de mogelijkheid ondersteunt om code in te sluiten in applicaties in andere programmeertalen.

De release bevat 253 commits van 11 mensen, geadopteerd gedurende 11 maanden.

Naast veel bugfixes bevat de release nieuwe functies, zoals de implementatie van de SRFI-43-vectorbibliotheek en de SRFI-64-test-API, gedeeltelijke ondersteuning voor de nieuwe Scheme R7RS-taalstandaard en een GDB-extensie voor Guile-foutopsporing.

Vertaling van het boek “Lisp in Small Pieces” gepubliceerd

Dit is een redelijk bekend boek van Christian Kennek, waarin de semantiek van Lisp en de basisprincipes van de implementatie ervan worden onderzocht aan de hand van het voorbeeld van het Scheme-dialect. Tijdens het vertelproces worden veel aspecten van de semantiek van de taal geanalyseerd, beginnend met verschillende varianten van omgevingen, via voortzettingen en uitzonderingen, eindigend met reflectie, de essentie van macro's, de C-compiler en het objectsysteem.

Het boek bevat 11 tolken, 2 samenstellers, een stapel oefeningen in elk hoofdstuk, veel interessant materiaal over de geschiedenis van Lisp en de redenen voor het nemen van bepaalde beslissingen in het ontwerp van de taal, een aantal toespelingen op moderne talen programmeren, evenals een kleine trailer met literatuur.

Er zijn geen onthullingen, ongelooflijk effectieve optimalisaties, krachtige systemen soorten en andere kenmerken van de moderne computerwetenschappen (het boek is tenslotte 20 jaar oud), maar er is een uitstekende solide introductie tot de implementatie van programmeertalen, ontworpen om beginners te interesseren en hen kennis te laten maken met de basisconcepten en technieken van deze materie, Zo wordt een basis gelegd voor verdere ontwikkeling.

Vandaag, 22 januari 2013, vond plaats nieuwe uitgave Een algemeen bekende vertolker van de Scheme-programmeertaal in kleine kringen is Scheme48, waarvan de ontwikkelaar een van de belangrijkste leden is van de Scheme Steering Committee, Jonathan Reese. De release is nummer 1.9 en er wordt vrij lang op gewacht, aangezien de tolk al relatief lang niet is bijgewerkt.

De belangrijkste toevoegingen zijn:

  • er is een nieuw FFI-mechanisme toegevoegd (het oude is nog steeds beschikbaar, maar zal binnenkort worden verwijderd);
  • een reeks functies toegevoegd voor netwerkondersteuning (met volledige ondersteuning voor IPv6 en UDP, nog niet gedocumenteerd);
  • records ondersteunen nu overerving (beschikbaar via het r6rs-records pakket);
  • letrec* toegevoegd;
  • de tolk waarschuwt nu voor cyclische afhankelijkheden en overschrijvingen in modules;
  • statistische profiler toegevoegd;
  • als de tolk-VM is gecompileerd met een compiler die GNU C ondersteunt, wordt directe threadcode gebruikt, wat de uitvoering versnelt;
  • andere toevoegingen met betrekking tot ondersteuning voor R6RS-mogelijkheden, het buildsysteem en licenties (zie de link "Details").

Lijst met de belangrijkste wijzigingen:

  • De eigen afvalverzamelaar van BIBOP GC is opnieuw ontworpen en wordt nu standaard gebruikt;
  • de implementatie van syntaxisregels is herschreven;
  • andere wijzigingen met betrekking tot het buildsysteem, licenties en POSIX-ondersteuning (zie de link "Details").

Er is een nieuwe versie van de implementatie van de Scheme-taal uitgebracht: GNU Guile 2.0.7. Ondanks de kleine wijziging in het versienummer zijn er verschillende interessante innovaties verschenen, namelijk:

  • Volledige ondersteuning voor infix-expressies (curly-infix-expressies). Nu kun je in plaats van (* a (+ b c)) schrijven (a * (b + c)).
  • Ondersteunt verschillende leesopties voor verschillende poorten.
  • Ondersteuning voor geneste toekomstige richtlijnen.
  • Speciale syntaxis voor het toevoegen van paden aan de omgevingsvariabelen GUILE_LOAD_PATH en GUILE_LOAD_COMPILED_PATH aan het einde van de padenlijst in plaats van aan het begin.
  • Een bug opgelost in de load-in-vicinity-functie die de mappen die zijn ingesteld in de %load-compiled-path variabele niet scande.
  • Vaste zoekvolgorde voor extensies. Guile verandert hiervoor nu de omgevingsvariabele LD_LIBRARY_PATH niet.
  • De functie make-vtable-vtable is verouderd, het wordt aanbevolen om make-vtable en te gebruiken .
  • Zijn gelijke oproepen geoptimaliseerd? en eqv? voor gevallen waarin een van de argumenten een constante is.
  • Nieuwe compilerwaarschuwingen -Wduplicate-case-datum en -Wbad-case-datum.
  • Talrijke kleine verbeteringen en bugfixes.

GNU Guix - nieuwe beheerder pakketten van het GNU-team

Ludovic Courtès, een van de bijdragers aan het GNU-project, kondigde de release aan van de eerste alfaversie van een nieuwe pakketbeheerder voor alle GNU/Linux-distributies - GNU Guix, gebaseerd op de Nix-pakketbeheerder.

Behalve standaard kenmerken software installeren, de-installeren en updaten GNU Guix ondersteunt transactionele upgrades met de mogelijkheid om terug te gaan naar een vorige versie, zonder rootrechten te draaien, aparte configuratieprofielen voor elke gebruiker te bevatten en een garbage collector te bevatten (om verouderde pakketten op te sporen en te negeren). Maar het belangrijkste kenmerk van GNU Guix is ​​dat het is ontwikkeld in de functionele taal Scheme.

Je kunt de broncode verkrijgen via de Git-repository.

Versie 5.2 van de programmeertaal Racket (voorheen PLT Scheme) werd geïntroduceerd.

Nieuw in deze versie:

  • De nieuwe `db'-bibliotheek biedt een interface op hoog niveau voor populaire RDBMS's: MySQL, SQLite, PostgreSQL en andere via ODBC.
  • Een nieuwe XREPL-collectie die ondersteuningsopdrachten biedt voor de Racket read-execute-print loop (REPL). Het zal nuttig zijn voor mensen die de consoleversie van Racket en alternatieve editors gebruiken.
  • De 'plot'-collectie is herschreven in Racket om PDF-uitvoer, logaritmische assen, histogrammen en meer te ondersteunen.
  • DrRacket gebruikt traditionele sneltoetsen: C-t create nieuw tabblad, C-w sluit het tabblad, C-r voert de definities uit.
  • Getypt racket:
    • Typed Racket biedt tools voor het debuggen van statische prestaties: het laat zien welke code zal worden geoptimaliseerd en welke niet.
    • Meer intuïtieve typen REPL-uitvoer en foutmeldingen.
    • Ondersteunt het definiëren van functies met optionele argumenten met dezelfde syntaxis als Racket.
  • Verschillende problemen opgelost met grafische interface, inclusief Ubuntu 11.10 (GTK+3) en 64-bit Mac OS X.
  • Interne definities hebben nu `let*'-semantiek als ze deze niet bevatten backlinks elimineert dit de prestatievermindering van het gebruik van innerlijke definities in plaats van 'let' en verandert de betekenis van programma's die voortzettingen in innerlijke definities vastleggen. Het gebruik van innerlijke definities wordt nu als de voorkeursstijl beschouwd.

Deze standaard is een relatief kleine herziening van de R5RS-standaard, waarbij de meest populaire kenmerken van de taal worden toegevoegd, maar de algehele structuur ongewijzigd blijft. In de geest van eerdere standaarden worden veel situaties overgelaten aan de auteurs van Scheme-taalimplementaties, waardoor er ruimte overblijft voor experimenten met hun eigen extensies.

De Scheme-taal heeft traditioneel redelijk goede ondersteuning voor Emacs. Deze ondersteuning wordt geleverd door een reeks pakketten die kunnen werken met zowel willekeurige implementaties van deze taal ( schema-modus, cmusschema, kwakzalvers-), en ondersteunen alleen specifieke implementaties ( xschema, gds, bij-modus, gambiet). Doorgaans is implementatiespecifieke ondersteuning iets uitgebreider dan pakketten die alle implementaties ondersteunen.

Dit artikel probeert alle kwesties van het ondersteunen van programmeren in Scheme te behandelen, en spreekt eerst over zaken die gemeenschappelijk zijn voor alle implementaties, en beschouwt pas daarna pakketten die ondersteuning implementeren voor specifieke versies van de taal.

Schema-modus

Schema-modus geleverd bij Emacs-distributies is een wijziging lisp-modus voor het werken met broncode in de Scheme-taal. Dit pakket implementeert de volgende functionaliteit:

  • syntaxisaccentuering
  • inkeping
  • waarbij gepaarde haakjes worden gemarkeerd

Op de basis schema-modus Er zijn verschillende andere pakketten gemaakt - en andere die de functionaliteit ervan uitbreiden door functies toe te voegen om code rechtstreeks vanuit de Emacs-buffer uit te voeren, enz. van dingen.

Deze modus wordt automatisch ingeschakeld voor bestanden die standaard extensies voor bestanden met bronteksten op Schema - .scm, .ss, enz. Aanzetten deze modus voor andere bestanden voegt u de volgende code toe aan uw initialisatiebestand (waarbij u .scm vervangt door de gewenste extensie):

(voeg toe aan lijst "auto-mode-alist"("\\.scm$" . schema-modus))

Als u het gedrag van het pakket wilt wijzigen, kunt u parameters instellen in een functie die, wanneer ze worden toegevoegd aan de schema-mode-hook variabele, zullen worden aangeroepen wanneer de modus in een bepaalde buffer wordt ingeschakeld. Bovendien kunnen sommige parameters worden ingesteld via standaardconfiguratietools. De corresponderende instellingengroep wordt schema genoemd.

Cmuscheme

Plastieken zak cmusschema is vele jaren geleden geschreven door Olin Shivers, maar is nog steeds een van de belangrijkste Scheme-pakketten. Dit pakket implementeert interactief werken met Scheme-taaltolken. Interactie met de tolk wordt gerealiseerd door het gebruik van pakketmogelijkheden komt eraan, meegeleverd met Emacs.

Pakketconfiguratie

Het instellen van het pakket is vrij eenvoudig: plaats de volgende code in uw initialisatiebestand

(autoload "run-scheme "cmuscheme" "Voer een inferieur schema uit" t) (setq schema-programmanaam "mzscheme" )

en het pakket wordt automatisch geladen de eerste keer dat u de run-scheme-functie uitvoert. De tweede regel in dit voorbeeld wordt gebruikt om de naam van de schema-interpreter op te geven, die u kunt vervangen door uw favoriete dialect. Alle instellingen voor dit pakket zijn ook beschikbaar voor interactieve configuratie via de cmuscheme-configuratiegroep.

De interpreterbuffer die door het pakket wordt gemaakt, gebruikt een speciale modus: inferior-scheme-mode, die kan worden geconfigureerd met behulp van de inferior-scheme-mode-hook. Bovendien, als er een bestand ~/.emacs_SCHEMENAME of ~/.emacs.d/init_SCHEMENAME.scm bestaat (waarbij SCHEMENAME de naam van de tolk is), zullen deze onmiddellijk worden uitgevoerd nadat de tolk is geladen.

Werken met het pakket

De belangrijkste functie van het pakket is de run-scheme-functie, die de geselecteerde Scheme-taalinterpreter start en interactieve code-uitvoering mogelijk maakt zonder Emacs te verlaten.

Hiermee kunt u bepalen welk deel van de code (een speciaal blok, een functiedefinitie of een enkele expressie) wordt uitgevoerd door gebruik te maken van verschillende functies, gedefinieerd door het pakket - de functie schema-send-definition (combinaties toetsen C-c C-e of C-M-x) geeft de huidige definitie door aan de tolk voor uitvoering; Met de functie Scheme-Send-Region (C-c C-r) kunt u een geselecteerd stuk broncode uitvoeren; het functieschema-send-last-sexp (C-x C-e) wordt gebruikt om de uitdrukking die voor de cursor staat te evalueren; en met de functie schema-laadbestand (C-c C-l) kunt u een volledig bestand in de tolk laden (hiermee kunt u code uitvoeren vanuit elk bestand dat door de gebruiker is opgegeven, niet alleen vanuit de huidige buffer).

De Scheme-interpreter draait in een aparte buffer genaamd *scheme* , waar de resultaten van het evalueren van expressies en functies ook worden uitgevoerd. Om snel vanuit de brontekstbuffer naar deze buffer over te schakelen, is er een aparte functie switch-to-scheme (C-c C-z). Omdat het vaak nodig is om code uit te voeren en de resultaten te bekijken, definieert het pakket bovendien ook twee functies die code naar de tolk sturen voor uitvoering, en overschakelen naar de *scheme* buffer - schema-send-definition-and-go ( C-c M-e) voor berekening van de huidige definitie en schema-send-region-and-go (C-c M-r) om de toegewezen broncode te evalueren.

Om met macro's te kunnen werken, biedt het pakket de functie schema-expand-current-form (C-c C-x), waarmee u de definitie van de huidige macro kunt uitbreiden naar de overeenkomstige schemacode. Code-uitbreiding wordt uitgevoerd door de tolk en uitgevoerd naar de *scheme*-buffer. En bij het werken met schema-implementaties die broncodecompilatie ondersteunen, kan de gebruiker profiteren van de functies schema-compile-file (C-c C-k) en schema-compile-definition (C-c M-c), die respectievelijk het bestand of de huidige definitie compileren. .

Zoals hierboven opgemerkt, is er een speciale modus in de interpreterbuffer - inferior-scheme-mode waarin alle commando's van de comint-modus werken, evenals de volgende commando's cmusschema- schema-compileerbestand (C-c C-k), schema-laadbestand (C-c C-l), schema-verzend-laatste-sexp (C-x C-e) en schema-verzenddefinitie (C-M-x).

Kwakzalvers

Het Quack-pakket is een uitbreiding op het pakket cmusschema en implementeert de volgende extra functies (veel daarvan hebben voornamelijk betrekking op het werken met PLT Scheme):

  • menu's waarmee u toegang krijgt tot taal-, tolk- en SRFI-documentatie, evenals de mogelijkheid om te zoeken naar een beschrijving van de functienaam die zich op de huidige cursorpositie bevindt;
  • nieuwe achtergrondverlichtingssets voor lettertype-lock— voor het PLT-schema en uitgebreid, voor andere implementaties;
  • mogelijkheid om het Griekse symbool te gebruiken lambda om lambda-uitdrukkingen aan te duiden (voorbeelden worden hieronder gegeven);
  • extra opties en opdrachten voor het invoegen van correcte haakjes voor openen en sluiten;
  • uitbreidingen voor inspringregels, met de mogelijkheid om te configureren voor verschillende schema-interpreters;
  • een uitgebreide versie van de opdracht run-scheme, die de opdrachtnamen van populaire Scheme-interpreters kent, en ook de laatst gelanceerde versie van de interpreter onthoudt;
  • een uitgebreide versie van het switch-to-scheme-commando;
  • mogelijkheid om de inhoud van .plt-collecties en opdrachten te bekijken om een ​​buffer te openen Dired voor de gewenste collectie.

Installatie en configuratie

Het pakket is geschreven door Neil Van Dyke en kan worden gedownload van de website van de auteur. Het pakket wordt geïnstalleerd door het naar een map te kopiëren waar Emacs het kan vinden, en geladen met de opdracht:

(vereist "kwakzalver")

Alle pakketinstellingen kunnen worden geconfigureerd met behulp van de quack-instellingengroep of via het Quack-menu. Deze instellingen omvatten de adressen van handleidingen en SRFI's, het definiëren van de sneltoets voor het voorvoegsel die door het pakket wordt gebruikt, enzovoort.

Gebruikers van PLT Scheme worden aangeraden handleidingen voor deze tolk te downloaden van de projectwebsite en deze in de collectie te installeren doc. De locatie van PLT Scheme-collecties wordt bepaald door de quack-pltcollect-dirs variabele, die alle mappen met werkende collecties kan weergeven, of omgevingsvariabelen PLTHOME en/of PLTCOLLECTS .

Het pakket vereist ook de aanwezigheid van het wget-programma, dat zal worden gebruikt om toegang te krijgen tot de SRFI.

Werken met het pakket

Na het downloaden van het pakket, naast de functies cmusschema En schema-modus De door het pakket gedefinieerde functies worden beschikbaar. De gebruiker kan deze functies uitvoeren met behulp van standaardmechanismen (sneltoetsen en/of starten op functienaam) of met behulp van het Quack-menu.

U kunt documentatie bekijken met behulp van verschillende functies. De quack-view-manual (C-c C-q m) functie wordt gebruikt om documentatie in een webbrowser te bekijken. Met deze opdracht kunt u zowel basisdocumentatie voor de Scheme-taal als documentatie voor specifieke implementaties bekijken. Om SRFI te bekijken, is een apart commando gedefinieerd: quack-view-srfi (C-c C-q s), dat om het nummer vraagt het vereiste document en opent deze in de browser. En voor PLT Scheme-gebruikers is ook de opdracht quack-view-keyword-docs (C-c C-q k) beschikbaar, die documentatie voor een bepaald trefwoord weergeeft ( het werk van dit team hangt af van correcte installatie PLT-schemadocumentatie).

Zoals hierboven opgemerkt, implementeert het pakket de run-scheme-functie (C-c C-q r), waarmee u Scheme-taaltolken kunt starten, deze kunt selecteren uit een lijst met bekende (inclusief starten met de noodzakelijke opties), en ook onthoudt laatste keuze gebruiker.

Voor gebruikers van PLT Scheme zijn ook handige functies gedefinieerd voor het werken met collecties. De quack-find-file (C-c C-q f) functie opent een bestand en gebruikt gegevens uit de huidige context om de bestandsnaam te verkrijgen. Als u deze functie bijvoorbeeld gebruikt terwijl de cursor op de code staat (require (lib "list.ss")), wordt u gevraagd het bestand list.ss uit de verzameling te openen mzlib. Bovendien is de functie quack-dired-pltcollect gedefinieerd, waarmee u een buffer kunt openen Dired voor de gewenste PLT Scheme-verzameling (bij het opgeven van een naam kan de gebruiker gebruik maken van het automatisch aanvullen van de verzamelingsnaam).

Dit pakket implementeert ook verschillende functies die de opmaak van de code wijzigen, waardoor het gebruik gemakkelijker wordt. De quack-tidy-buffer (C-c C-q t) functie laat de code opnieuw inspringen, vervangt tabs door spaties, verwijdert extra lege regels, verwijdert volgregels witruimte tekens in regels, en voegt ook een nieuwe regel toe aan het einde van het bestand als die er niet is. De quack-toggle-lambda-functie (C-c C-q l) verandert de declaratie van de huidige functie van (define (func args) ...) naar (define func (lambda (args) ..)), waardoor het lambda-teken kan worden worden weergegeven in de code (indien ingeschakeld, opties voor weergave van dit symbool). Bijvoorbeeld zoals dit:

GCA-pakket

GCA— een pakket dat is ontworpen om effectief te werken met Scheme-broncode. Het is ontworpen om het Gauche-schema te ondersteunen, maar kan met andere dialecten worden gebruikt. Leuk vinden kwakzalvers- breidt het de functionaliteit van het pakket uit cmusschema.

Dit pakket heeft de volgende kenmerken:

  • stukjes code invoegen met behulp van het sjabloonmechanisme
  • beschrijvingen voor functies weergeven
  • naam toevoeging

Dit pakket heeft enkele architectonische verschillen met andere pakketten - in plaats van te communiceren met tolken via standaardinvoer en -uitvoer, gebruikt dit pakket een eenvoudig netwerkprotocol om gegevens over te dragen. Deze aanpak stelt je in staat om te presteren grote hoeveelheid taken, maar is sterk afhankelijk van de implementatie van de tolk en vereist afzonderlijk proces Schema (server gds), die zal worden gebruikt voor interactie met andere processen.

Installatie en configuratie

Plastieken zak gds komt met nieuwste versies Guile, dus het enige dat u hoeft te doen is de Emacs Lisp-bronbestanden aan het Emacs-zoekpad toevoegen en deze in het initialisatiebestand plaatsen volgende regel:

(vereist "gds")

Met deze opdracht wordt het pakket gedownload en wordt een afzonderlijk proces gestart dat verantwoordelijk is voor de interactie met schema-interpreters. Het is vermeldenswaard dat om het pakket te laten werken, er een apart pakket voor Scheme aanwezig moet zijn in de Guile-zoekpaden. Als het pakket zich op een niet-standaard locatie bevindt, kunt u de locatie ervan opgeven met behulp van de variabele gds-scheme-directory. Als dit pakket niet aanwezig is, zal het pakket anders niet volledig worden geladen.

Andere instellingen kunnen worden ingesteld met behulp van de gds-instellingengroep.

Werken met broncode

Plastieken zak gds gebruikt dezelfde sneltoetsen om de code te berekenen als cmusschema. Een uitzondering is de functie gds-eval-expression (C-c C-e), die de in de minibuffer ingevoerde expressie evalueert.

Eén van de leuke toevoegingen doorgevoerd gds is om de namen van functies en variabelen in te vullen, en om hulp te krijgen over specifieke symbolen en/of om op naam naar een symbool te zoeken.

Het aanvullen van namen wordt gedaan door de gds-complete-symbol-functie (M-TAB-snelkoppeling), die probeert alle bekende symbolen te vinden waarvan de namen overeenkomen met de letters vóór de cursor. Als er één naam wordt gevonden, wordt deze onmiddellijk ingevoegd, maar als er meerdere opties zijn, wordt een nieuw venster getoond waarin de gebruiker de gewenste naam kan selecteren.

Hulp krijgen voor een specifiek symbool kunt u doen met behulp van de functie gds-help-symbol (C-h g), die dezelfde resultaten oplevert als het uitvoeren van de opdracht (help SYMBOOL) in de interactieve Guile-omgeving. De symboolnaam wordt door de gebruiker gevraagd via de minibuffer, maar de standaardwaarde is de naam waarop de cursor staat. Als u de exacte naam van een symbool niet meer weet, kunt u de functie gds-apropos (C-h G) gebruiken, die vergelijkbaar is met execute (apropos REGEXP) in Guile, en die een lijst met symbolen afdrukt waarvan de namen overeenkomen met de ingevoerde reguliere expressie.

Foutopsporing

Om de kansen te benutten gds bij interactief werken moet de gebruiker nog steeds expliciet de modules specificeren waarmee gewerkt zal worden gds. Als u bijvoorbeeld de volgende code gebruikt, worden alle modules geladen die nodig zijn voor gebruik:

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

Hierna kunt u ermee werken gds. Om een ​​breekpunt in de procedure proc_name in te stellen, wordt het volgende gebruikt, berekend in de broncodebuffer:

(installeren-trap (make #:gedrag gds-debug-trap #:procedure proc_name))

en nadat u de opgegeven procedure hebt aangeroepen, ontvangt u in de buffer gds iets zoals dit:

Oproepprocedure: => s s --:** PID XXXXX (Guile-Debug)--Alles--------

in deze buffer kunt u door de stapel navigeren, de status ervan bekijken, de uitvoering van het programma voortzetten en/of er doorheen stappen. Het werk in de stapelbuffer wordt verzekerd door een aantal opdrachten te gebruiken die aan individuele toetsen zijn gebonden.

De volgende toetsen kunnen worden gebruikt om door de functie-aanroepstapel te bladeren: u , C-p en pijl-omhoog worden gebruikt om omhoog te gaan in de aanroepstapel en dat frame te selecteren (gds-up-functie), d , C-n en pijl-omlaag worden gebruikt om naar beneden te gaan (gds-down) , en de RET-toets wordt gebruikt om het frame te selecteren waarop de cursor zich bevindt.

Als u een stapelframe selecteert, wordt het overeenkomstige deel van de broncode weergegeven. Bovendien zullen sommige functies bij de uitvoering ook gebruik maken van de omgeving die aan het geselecteerde frame is gekoppeld.

Extra functies die in de stapelbuffer werken, zijn onder meer:

gds-evalueer (e-sleutel) stelt u in staat een expressie te evalueren met behulp van de omgeving die overeenkomt met het geselecteerde frame, waarbij het resultaat wordt weergegeven in het echogebied; gds-frame-info(i) toont informatie over het geselecteerde frame - een regel in het bronbestand, de bijbehorende expressie, frametype, enz.; gds-frame-args(A) toont applicatieframe-argumenten; gds-proc-bron(S) toont de broncode van de aangeroepen procedure. Deze functie is erg handig in gevallen waarin de procedure is gemaakt door een anonieme lambda-expressie, aangezien dergelijke procedures in de functieaanroepstapel worden weergegeven als Wat nog niet duidelijk maakt wat er verder gaat gebeuren.

Om de uitvoering van een onderbroken programma voort te zetten, gds werktuigen volgende functies:

gds-go (g, c of q) zet de uitvoering van het programma voort; gds-step-bestand (SPC) voert één stap uit met functies die tot hetzelfde bronbestand behoren als het geselecteerde stapelframe. Functies uit andere bestanden worden uitgevoerd, maar zonder deze in te voeren; gds-stap-in (i) voert de volgende stap uit. Dit is het meest gedetailleerde niveau van programma-uitvoering; gds-stap-over (o) voert het programma uit totdat het geselecteerde stapelframe klaar is met uitvoeren.

Met behulp van al deze functies kan de ontwikkelaar gedetailleerde informatie ontvangen over de status van het programma en kan hij fouten opsporen en corrigeren.

Schema48

schema48- een ander pakket op basis van cmusschema, maar biedt uitgebreide ondersteuning voor de implementatie van Scheme48. Dit pakket voegt ondersteuning toe lettertype-lock voor Scheme48-specifieke trefwoorden en operators, en extra bindingen toetsen voor expressie-evaluatiecommando's.

De procedure voor het installeren van dit pakket is standaard: plaats gambit.el op een plaats waar Emacs het kan vinden en voeg de volgende regels toe aan het initialisatiebestand:

(automatisch "gambit-inferieure-modus"gambit" laden "Haak de Gambit-modus in cmuscheme.") (automatisch "gambit-modus "gambit" laden "Haak de Gambit-modus in het schema.") (add-hook "inferieure-schema-modus-hook (functie gambit-inferieure-modus)) (add-hook "scheme-mode-hook (functie gambit-modus)) (setq schema-programmanaam "gsi -: D-" )

De Gambit-interpreter wordt gestart met behulp van de run-schema-functie die is geïmplementeerd in cmusschema, Maar gambiet voegt er uitvoerfilterroutines aan toe, waardoor het pakket locatie-informatie kan verkrijgen bron bestand. Na het starten van de tolk kan de gebruiker standaard sneltoetsen gebruiken om code uit te voeren en te compileren - C-x C-e, C-c C-l, C-c C-k, enz.

Naast de kenmerken cmusschema, plastieken zak gambiet biedt verschillende functies die zijn ontworpen voor het debuggen van broncode:

gambiet-voortzetten (F8 of C-c c) ga door met het uitvoeren van de code. Vergelijkbaar met het commando,c van de tolk; gambit-crawl-backtrace-nieuwer (F9 of C-c ]) ga naar het vorige frame in de keten. Vergelijkbaar met het commando - tolk; gambit-crawl-backtrace-ouder (F10 of C-c [) naar het volgende frame in de keten gaan. Vergelijkbaar met het commando + tolk; gambiet-stap-voortzetting (F11 of C-c s) voer één rekenstap uit, inclusief het invoeren van de aangeroepen functie. Insgelijks opdracht tolk; gambiet-sprong-voortzetting (F12 of C-c l) voer één rekenstap uit zonder de opgeroepen functie in te voeren. Vergelijkbaar met het tolkcommando,l; Gambit-kill-laatste pop-up (C-c_) verwijder het venster dat is gemaakt om de expressie weer te geven.

Er zijn kortere sneltoetsen voor deze opdrachten: M-c , M-[ , M-] , M-s , M-l en M-_ , maar deze zijn standaard niet ingeschakeld omdat ze niet helemaal de conventies van sneltoetsen in Emacs volgen. Om het gebruik ervan mogelijk te maken, moet u de volgende opdracht uitvoeren (of deze in het initialisatiebestand plaatsen):

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

Bijenmodus (bmacs)

bmacs is een implementatie van een geïntegreerde softwareomgeving voor het werken met Bigloo Scheme. Dit pakket implementeert de volgende functies:

  • foutopsporing in code;
  • profilering;
  • automatisch aanmaken en bijwerken van Makefiles;
  • codenavigatie;
  • integratie met versiebeheersystemen;
  • documentatie bekijken;
  • interactieve code-uitvoering;
  • macro-uitbreiding;
  • enige ondersteuning voor een geletterde programmeerstijl.

Dit pakket vereist een aantal extra hulpprogramma's om te werken, waarvan de meeste bij Bigloo worden geleverd. Documentatie is te vinden op de projectwebsite of als onderdeel van de distributie.

Installatie en configuratie

Dit pakket wordt geleverd als onderdeel van Bigloo Scheme en bevindt zich in de bmacs-submap van de distributie. Om het pakket te installeren, gaat u naar deze map en voert u daar de opdracht uit:

Maak make install EMACSDIR =

die zal vestigen benodigde bestanden naar de door u aangegeven locatie. Hierna kunt u de volgende regels aan uw initialisatiebestand toevoegen om het pakket automatisch te laden wanneer u de bronbestanden opent:

(automatisch laden van "bdb "bdb" "bdb mode" t) (automatisch laden van "bee-mode "bee-mode" "bee mode" t) (setq auto-mode-alist (voeg "(("\\.scm$" toe. bee-mode) ("\\.sch$" . bee-mode) ("\\.scme$" . bee-mode) ("\\.bgl$" . bee-mode) ("\\.bee$ ". bee-mode)) auto-mode-alist))

Pakketinstellingen kunnen worden ingesteld met behulp van de bijeninstellingengroep, die instellingen biedt voor bij-modus, en groepen dbg & beestje, gebruikt om debugger-instellingen in te stellen.

Werken met broncode

Na het downloaden bij-modus de gebruiker kan basisopdrachten uitvoeren met behulp van de overeenkomstige werkbalkpictogrammen, of door te selecteren noodzakelijke punten uit het Bee-menu, dat verschijnt wanneer de modus start.

Om te laten inspringen in overeenstemming met de Bigloo-conventies, moet het pakket bij-modus definieert verschillende functies: bee-indent-sexp (C-M-q) laat de huidige uitdrukking inspringen, bee-indent-define ( C-c TAB C-d) doet dit voor de huidige functiedefinitie, bee-indent-last-sexp (C-c TAB C-l) laat de uitdrukking vóór de cursor inspringen, enz.

Een zeer belangrijke reeks functies die worden gebruikt bij het werken met broncode zijn functies voor het zoeken naar definities van functies en variabelen. Om een ​​definitie van een variabele te vinden, kunt u bijen-tags-vinden (C-x 5 .) of bijen-tags-vinden-variabele (C-c C-d f) gebruiken. En om naar een moduledefinitie te zoeken, is er een functie bij-vind-module (C-c C-d m). Daarnaast, bij-modus overschrijft twee sneltoetsen - M-. & M-, die binden aan de functies bee-tag-find en bee-tags-find-next, waardoor functie- en klassedefinities kunnen worden gevonden.

Om het werken met modules te vereenvoudigen, bij-modus definieert een reeks functies die de lijst met modules beheren die door de huidige broncode zijn geïmporteerd - de bee-import-bindingsfunctie (C-c RET i), evenals de lijst met functies en variabelen die uit de huidige module zijn geëxporteerd - bee-export- functie (C-c RET f) en bijenexportvariabele (C-c RET v). Daarnaast is er een aparte functie waarmee u symbolen uit C-bestanden kunt importeren - bee-import-c-file (C-c RET c), en deze werkt ook de Makefile bij om een ​​afhankelijkheid toe te voegen om de bijbehorende code te compileren.

Het pakket biedt ook enige ondersteuning voor zogenaamd geletterd programmeren. De geboden ondersteuning is niet compleet, maar biedt u in ieder geval de mogelijkheid om links naar module- en functiebeschrijvingen in de code in te voegen. Dit wordt bereikt door de trefwoorden @path , @node & @deffn te gebruiken in moduleopmerkingen en functiebeschrijvingen. De trefwoorden @path & @node definiëren de bestands- en documentatiesectie die een bepaalde module beschrijft en worden gespecificeerd in het commentaar bij de moduledeclaratie. En het trefwoord @deffn wordt aangegeven in de opmerking voor de functie. Deze gebruiken trefwoorden, kan de ontwikkelaar snel naar relevante secties en functiebeschrijvingen navigeren, wat verbeterde codedocumentatie mogelijk maakt.

Code uitvoeren en compileren

Net als andere pakketten, bij-modus Hiermee kunt u Scheme-code rechtstreeks vanuit de Emacs-buffer uitvoeren. Om de tolk te starten, moet u de functie ude-repl-other-frame (C-c C-r C-r) uitvoeren en het juiste werkbalkpictogram selecteren ( Verv), of het overeenkomstige menu-item.

En na het laden van de tolk kan de gebruiker de code uitvoeren met behulp van de volgende functies:

  • ude-repl-send-buffer (C-c C-r b) verzendt de volledige buffer ter berekening;
  • ude-repl-send-region (C-c C-r r), verzendt een geselecteerd codeblok naar de tolk;
  • bee-repl-send-define (C-c C-r d) wordt gebruikt om de huidige definitie uit te voeren;
  • bij-repl-send-last-sexp (C-c C-r l) evalueert de waarde van de uitdrukking vóór de cursor;
  • bee-repl-send-toplevel-sexp (C-c C-r t) wordt gebruikt om de gehele huidige expressie te evalueren.

Als u macro's gebruikt, moet u deze vaak kunnen uitbreiden. Net als bij het werken met gewone code, bij-modus implementeert een reeks functies voor het uitbreiden van macro's in uw code (in dit geval wordt de gehele buffer gescand op de aanwezigheid van macrodefinities):

  • bij-expand-buffer (C-c C-e C-e) zorgt ervoor dat macro's in de huidige buffer worden uitgebreid;
  • bee-expand-region (C-c C-e C-r) breidt macro's uit in code-behind;
  • bee-expand-define (C-c C-e C-d) breidt macro's uit in de huidige definitie
  • bij-expand-last-sexp (C-c C-e C-l) breidt macro's uit in de expressie vóór de cursor;
  • bee-expand-toplevel-sexp (C-c C-e C-t) breidt de macro's in de huidige expressie uit.

Om programma's te compileren, hebt u een Makefile nodig die de afhankelijkheden tussen modules beschrijft en compilatievlaggen specificeert. Het project vereist een zogenaamde rootdirectory - bij-modus probeert de hoofdmap van het project te bepalen door te zoeken naar een van de Makefile-, .afile- of .etags-bestanden, of de hoofdmap kan worden ingesteld met behulp van de functie ude-user-set-root-directory (C-c C-p C-r) of de juiste werkbalkknop.

Zodra de hoofdmap is opgegeven, kan een Makefile worden gegenereerd met behulp van de functie ude-generate-makefile (C-c C-c a of C-c C-c C-l), die de gebruiker zal vragen om de naam van het uitvoerbare bestand waarin de gegeven broncode zal worden geplaatst. gecompileerd. Als de Makefile al bestaat, zullen dezelfde sneltoetsen deze bijwerken en ook de .afile- en .etags-bestanden opnieuw opbouwen. Daarnaast is er een reeks functies voor het bewerken van Makefile - ude-edit-makefile (C-c C-c e), het bijwerken van Makefile - ude-update-makefile (C-c C-c u), het schakelen tussen debug- en releaseversies van het programma - ude- makefile-debug-mode (C-c C-c C-d) & ude-makefile-final-mode (C-c C-c C-f) en andere.

Zodra de Makefile bestaat, is het mogelijk om de code te compileren met behulp van de functie ude-mode-compile-from-menu (C-c C-c C-c). U kunt de compilatie onderbreken met behulp van de kill-compilatiefunctie (C-c C-c k).

En nadat de compilatie is voltooid, kunt u het uitvoerbare bestand uitvoeren met de functie ude-execute (C-c C-c C-r).

Foutopsporing en profilering

Het Bigloo-pakket wordt ook geleverd met een debugger waarmee u fouten kunt opsporen op broncodeniveau. bij-modus ondersteunt interactie met deze debugger in Emacs. Om de debugger te starten, moet u de bij-debug-functie (C-c C-b C-b) uitvoeren of het juiste werkbalkpictogram of menu-item selecteren. Maar het starten van de debugger maakt er niet automatisch verbinding mee, dus je moet expliciet de bee-toggle-connect-buffer-functie (C-c C-b c) uitvoeren om de huidige buffer aan de debugger te binden, waardoor je breekpunten kunt instellen en andere kunt uitvoeren. taken terwijl u zich in de brontekstbuffer bevindt.

Programmaprofilering wordt automatisch ondersteund als u Makefile-generatie gebruikt. Om code te profileren, moet u deze eerst compileren met profileringsondersteuning, wat wordt gedaan met de bee-profiler-start-functie (C-c C-p c). En na de compilatie kunt u bee-profiler-inspect (C-c C-p i) uitvoeren, waarmee het programma wordt uitgevoerd, en vervolgens het hulpprogramma bglprof, dat uitvoeringsgegevens verzamelt die u kunt analyseren.

Andere functies

Het pakket biedt mogelijkheden om te ontvangen referentie informatie. Dit kunt u doen door de bee-doc-visit-functie (C-c C-d i) uit te voeren of door op het Info-pictogram in de werkbalk te klikken. Deze functie gedraagt ​​zich anders, afhankelijk van huidige situatie cursor - als de cursor op een identificatie staat, wordt documentatie voor deze identificatie uitgegeven, waarna documentatie voor deze regio wordt uitgegeven; Anders wordt de gebruiker gevraagd naar de naam van de betreffende documentatiesectie en wordt de geselecteerde sectie weergegeven.

De informatie die aan de gebruiker wordt getoond, is afkomstig uit de infobestanden die bij Bigloo worden geleverd. Bovendien wordt de documentatie in de mappen van het huidige project doorzocht en automatisch toegevoegd. Bovendien kan de gebruiker aanvullende documentatiebestanden opgeven die moeten worden doorzocht.

Plastieken zak bmacs Daarnaast biedt het een aantal functies voor het werken met versiebeheersystemen, waardoor je op projectniveau met data kunt werken. Maar door de opkomst van nieuwe versiebeheersystemen en de bijbehorende interfaces daarvoor, zijn deze functies niet bijzonder in trek.

Bovendien zijn er veel extra functies geïmplementeerd door dit pakket, bijvoorbeeld ondersteuning voor het werken met code geschreven in C, enz., maar een beschrijving van deze mogelijkheden valt buiten het bestek van dit artikel.

Schemaondersteuning in SLIME

Voor gebruik SLIJM met Scheme moet u dit doen basisopstelling pakket, zoals beschreven in de pakketsectie, en download vervolgens de vereiste componenten. Over het algemeen gebeurt dit als volgt:

(add-hook "slime-load-hook (lambda() (vereist "slijmschema)))

Met dit commando worden de hooks geïnstalleerd die nodig zijn om mee te werken SLIJM, maar voor elk van de ondersteunde dialecten moet u dit mogelijk doen aanvullende instellingen in overeenstemming met de instructies in het overeenkomstige bestand - swank-kawa.scm of swank-mit-scheme.scm.

En alles wat verder met werken te maken heeft SLIJM, beschreven in de overeenkomstige sectie.

Standaard mag er slechts één Scheme-proces worden uitgevoerd. Maar u kunt het pakket gebruiken als u meerdere processen tegelijkertijd moet uitvoeren.

Daarnaast de bezorging bmacs pakketten ook beschikbaar Cee, bedoeld voor het bewerken van de C-code die wordt gebruikt om Bigloo-extensies te schrijven, bug-mode, die ondersteuning biedt voor de Bigloo-foutopsporing, en ude(Unix Development Environment), dat compilatieondersteuning implementeert, en diverse nutsvoorzieningen, gebruikt bij het werken met Bigloo.

Het is vermeldenswaard dat als de Makefile niet bestaat, deze functie ervoor zorgt dat de compilatie van de uitvoerbare module begint vanuit een enkel bestand.

Zogenaamde zwaan-module.

Alle componenten die verband houden met Scheme bevinden zich in de contrib-submap van de distributie SLIME, vergeet dus niet om het toe te voegen aan uw zoekpaden.

Welke taal moet je kiezen om te leren programmeren?Je moet niet ergens halverwege beginnen met programmeren.

Eerst moet je je hersenen trainen, het vermogen om algoritmen te maken en deze te beschrijven, waarbij je de mogelijkheden van een bepaalde taal kent. Op binnenlandse scholen en universiteiten wordt programmeren meestal onderwezen met Basic of Pascal als voorbeeld. Tot nu toe wordt Pascal beschouwd als een van beste talen voor training is het een strikte toespraak met statisch typen, wat zonder mogelijk maakt onnodige problemen oefen de principes van procedureel en objectgeoriënteerd programmeren. Maar nu ik kennis heb gemaakt met het onderwijsmateriaal van vooraanstaande westerse universiteiten (Berkeley, Stanford, MIT), ben ik het ermee eens dat het een goed idee zou zijn om te gaan studeren met een van de functionele talen.

Over het algemeen is het nogal vreemd, maar het functionele paradigma wordt koppig genegeerd door het binnenlandse onderwijs. Om deze kloof te overbruggen, wil ik het hebben over de programmeertaal Scheme.

Scheme is een zeer eenvoudige programmeertaal. Het is heel goed mogelijk om het in één dag te leren, maar deze eenvoud is bedrieglijk. Scheme is ook een zeer krachtige taal. Er zijn enorm veel implementaties.

Certificeringsprogramma's worden opgeslagen in *.scm-bestanden, of u kunt deze gebruiken interactieve modus tolk, vergelijkbaar met Python.

Constanten en variabelen

Laten we beginnen met het leren van de basisstructuren van Scheme. Laten we eerst de constanten definiëren:

123 - geheel getal

3.1415926 - fractioneel getal

2 + 3i - complex getal

2/3 - fractie

#B1111 - binair getal

#xFF - hexadecimaal lidwoord

#O123 - octaal getal

#\A - enkel teken

"Hallo Wereld!" - Tekenreeks

"Hallo - symbool

#f - logische waarde

Constanten kunnen worden bediend met behulp van operators of functies. Scheme is tenslotte een functionele taal en heeft dus alle functies.

In de wiskunde ben je bekend met de schrijfvorm van de functies f (x) of t (a, b). Maar hetzelfde kan worden geschreven in de vorm (f x) of (t a b). Dit is precies de vorm van opnemen die Scheme gebruikt. Niet als een rekenkundige uitdrukking, die bijvoorbeeld in de vorm 2 + 3 is geschreven, maar in een voorvoegsel - (+ 2 3).

Bijv.:

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

29/2

bedrog> (+ 1 1 1 1 1)

bedrog> (/2)

bedrog> (vierkant 2)

1.4142135623731

Om variabelen te declareren, gebruikt u de constructie (definieer waardenaam)

bedrog> (definieer een 2)

bedrog> (definieer b 2)

bedrog> (+ a b)

De waarde van een reeds bestaande variabele kan worden gewijzigd met behulp van de constructie (set! name value)

bedrog> (set! een 5)

bedrog>a

Functies worden gedeclareerd met behulp van de constructie (define (parameternaam) function_type)

bedrog> (definieer (vierkant x) (* x x))

bedrog> (vierkant 3)

Om recursie aan te tonen, zal ik een voorbeeld geven van het berekenen van faculteit:

(Definieer (feit x)

(Als (= x 1)

(* X (feit (- x 1)))))

Zoals je al hebt begrepen, kan een toestand worden gecontroleerd met behulp van de constructie (als de toestand op enigerlei wijze aanwezig is)

Zonder in details te treden, zal ik de aandacht vestigen op de belangrijkste functies

(Toon "Hallo, wereld!") - Geef een string weer

(Nieuwe regel) - ga naar een nieuwe regel

Het is handig om lijsten te gebruiken om met datasets te werken

bedrog> (definieer nums (lijst 1 2 3 4 5 6 7 8 9 10)) - declareer de lijst

guile> (list-ref nums 0) - lees element met nummer 0

bedrog> (car nums) - lees het eerste element

guile> (cdr nums) - lees alle andere elementen

(2 3 4 5 6 7 8 9 10)

U kunt alle lijstelementen in één keer verwerken

genereer een nieuwe lijst door voor elk element een functie toe te passen

bedrog> (kaart vierkante nums)

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

bedrog> (kaart (lambda (x) (* x 3)) nums)

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

Met de lambda-constructie kunt u functies naar behoefte declareren zonder ze een naam te geven. Als je in Python programmeert, ken je deze constructies al.

In feite heeft Scheme geen lussen zoals ze zich bevinden imperatieve talen. Hier wordt recursie voor dezelfde doeleinden gebruikt. Laten we bijvoorbeeld de inhoud van de lijst in een kolom weergeven

(Definiëren (printlijst lst)

(Als (niet (null? Lst))

(Begin (weergave (autolijst))

(Nieuwe lijn)

(Printlijst (cdr lst)))))

De constructie (begin ...) wordt gebruikt als u meerdere operatoren moet invoegen terwijl de syntaxis er slechts één toestaat.

Met de volgende constructie kunt u de for-lus simuleren die bekend is uit andere programmeertalen:

(Laat lus ((i 1))

(Weergave i)

(Nieuwe lijn)

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

De let-constructie wordt gebruikt wanneer u lokale variabelen binnen een expressie moet declareren, of wanneer u een geneste functie moet declareren. Op deze manier kunnen vrijwel alle mogelijke cyclusopties worden geïmplementeerd. Natuurlijk kunt u altijd uw eigen functie maken om de notatie in te korten, aangezien functies net als eenvoudige gegevens als parameters aan andere functies kunnen worden doorgegeven. Over het algemeen kunt u met Scheme de taal naar wens aanpassen. Een verbazingwekkend flexibele taal.

U kunt bijvoorbeeld de implementatie geven van de functie voor het berekenen van een bepaalde integraal

(Definieer (func x)

(Definiëren (integreren a b e f)

(Definieer som 0)

(Laat lus ((i a))

(Als (

(Set! Som (+ som (* (f i) e)))

(Lus (+ i e)))))

Som)

(Display (integratie 0 1 0.01 func))

(Nieuwe lijn)

Guile officiële website

Schemers.org

Video-opnamen van lezingen over de cursus The Structure and Interpretation of Computer Programs aan Berkeley University

Omdat Scheme een academische taal is, is er over het algemeen veel informatie over te vinden. Tegelijkertijd kun je met kennis van deze taal niet alleen met een frisse blik kijken naar verschillende constructies in andere talen (zoals bijvoorbeeld Python).

Invoering

Schema- een functionele programmeertaal, een van de twee bekendste dialecten van de taal van onze tijd Lisp. Guy L. Steele En Gerald Jay Sussman van het Massachusetts Institute of Technology ( MIT) - creëerde het halverwege de jaren zeventig. Precies Schema wordt al geruime tijd gebruikt MIT voor het leren programmeren (nu vervangen door Python) en precies aan Schema voorbeelden zijn geschreven in het beroemde boek "Structuur en interpretatie van computerprogramma's"- de bijbel van elke zichzelf respecterende programmeur.

Voor ID Verduistering Er is een plug-in waarmee je kunt programmeren Schema. In dit artikel zullen we de belangrijkste kenmerken van deze plug-in bekijken, het gebruik ervan en de configuratieprocedure bestuderen.

De plug-in heet SchemaScript en maakt deel uit van het project SchemaManier. U kunt de nieuwste versie van deze plug-in downloaden van de website (na het downloaden hoeft u alleen maar te kopiëren jar-bestand naar de catalogus eclipse/plug-ins). Het project ontwikkelt zich actief, de nieuwste versie wordt genoemd 1.3.0 alfa10 en uitgebracht op 05/09/2010 GitHub. Aanvullende informatie over de plug-in en enkele trucs die deze mogelijk maakt SchemaScript, en de mogelijkheden ervan zijn te vinden in de blog Dominique Boucher- de auteur van deze extensie.

Het is vermeldenswaard dat zelfs de nieuwste versie SchemaScript werkt niet binnen Eclips Helios, dus voorlopig voor de ontwikkeling in de taal Schema zou gebruikt moeten worden Eclips Galileo.

UPD 17-07-2010: De nieuwste versie op GitHub werkt Eclips Helios, maar het moet worden samengesteld uit bronnen. Na enige tijd beloofde Dominic de distributie weer op te bouwen.

Verduistering-perspectief Schema

Na het installeren van de plug-in zal deze beschikbaar zijn Verduistering-perspectief Schema. Standaard ziet het er zo uit:

Perspectief omvat weergave (in termen van Verduistering) projectnavigator - Navigator, weergave met de geparseerde inhoud van het bewerkte bestand - Overzicht, waarin een lijst met definities van constanten en functies wordt weergegeven, evenals twee samengevouwen weergaven: een weergave met een pictogram in de vorm van de letter lambda - Definities en bekijken Troosten.

Naar hoofdmenu Verduistering groep commando's toegevoegd Schema, voornamelijk bedoeld om de tolk te controleren. Het snelstartpaneel bevat drie knoppen (voorzien van pictogrammen in de vorm van de letter lambda), van links naar rechts: start de tolk, start de tolk opnieuw en stop de tolk.

Voordat u met de editor gaat werken, moet u een bestand maken Eclipse-project, waarin de broncodebestanden worden opgeslagen. Eigen aan Schema projecttype plug-in SchemaScript biedt dit niet, dus u moet een normaal project vanuit de map maken Algemeen:

Het aangemaakte project wordt in de navigator weergegeven:

Nu kunt u in het project uitvoeren Nieuw -> Bestand en maak een bestand dat is ontworpen om de broncode op te slaan Schema. Dit bestand moet de extensie .ss of .scm. Bestanden met deze extensies worden bewerkt met de speciale editor die in het pakket zit SchemaScript.

Broncode bewerken

SchemaScript biedt een broncode-editor voor de taal Schema met behoorlijk rijke mogelijkheden. Laten we ze eens nader bekijken.

Allereerst is het vermeldenswaard waarbij gepaarde haakjes worden gemarkeerd. Bij het bewerken van de code naar Lisp-achtige talen is dit kenmerk nodig, omdat men bij elke min of meer complexe constructie in de war kan raken welk openingshaakje overeenkomt met welk sluithaakje.

De editor bevat een ingebouwd Correctheidsanalysator voor S-uitdrukkingen. Als u bijvoorbeeld het haakje sluiten weglaat, wordt er een foutmelding gegenereerd:

Er is ook zoiets nuttigs als autosubstitutie of voltooiing van de expressie. Dat wil zeggen, als u op drukt tijdens het typen Ctrl+spatie, dan verschijnt er een venster met beschikbare opties voor het voltooien van de ingevoerde structuur:

Bij het maken van definities (bijvoorbeeld door het trefwoord definiëren) worden ze aan de weergave toegevoegd Overzicht, waarmee u indien nodig snel toegang krijgt tot de gewenste definitie:

Inpluggen SchemaScript voegt twee groepen items toe aan het contextmenu van de code-editor: Bron- bevat opdrachten voor het bewerken van de broncode - en Eval- bevat opdrachten voor de interpretatie ervan:

Overweeg een groep menu-items Bron:

Zoek definitie- zoekt naar de definitie van een symbool in de broncode. Dat wil zeggen dat we bijvoorbeeld moeten kijken naar hoe het symbool is gedefinieerd vierkante meter. Om dit te doen, plaatst u de cursor achter dit teken

en druk op F12. De cursor verplaatst zich naar de functiedefinitie vierkante meter, en deze definitie zal worden benadrukt:

Compleet symbool- we zijn al bekend met dit commando; het is een automatisch aanvulcommando.

Beschrijf symbool- geeft een tooltip weer met een beschrijving van het symbool. Bijvoorbeeld het symbool dat we in het vorige voorbeeld hebben overwogen vierkante meter is een functie:

Kopopmerking invoegen- voegt een globaal commentaar toe aan het begin van het broncodebestand. In de instellingen (zie hieronder) kunt u enkele velden voor een dergelijk commentaar definiëren: auteur, copyright, enz.

Hoofdstukcommentaar invoegen- voegt commentaar toe aan een bepaald codeblok - een reeks functies en definities.

Sectieopmerking invoegen- voegt een commentaar toe aan een specifieke functie of definitie.

Schakel commentaar in- commentaar geven op/verwijderen van commentaar op het geselecteerde codeblok. Als het codeblok geen commentaar is, worden er leidende tekens ";" aan toegevoegd:

En dienovereenkomstig, omgekeerd: als er commentaar wordt gegeven op een uitdrukking, worden de commentaarsymbolen verwijderd:

Ruimten comprimeren- verwijdert extra voorafgaande en volgende spaties en nieuwe regels. Zoiets als een functie trimmen:

Formaat- formatteert de code in overeenstemming met de opgegeven instellingen. Laat extra spaties en regeleinden inspringen en verwijderen.

Codeer vóór het formatteren

Codeer na formatteren

Wissel S-uitdrukkingen om- wijzigt de volgorde van S-expressies van hetzelfde nestniveau. Als u in het vorige voorbeeld bijvoorbeeld deze opdracht uitvoert, dan lijst En lambda ruil plaatsen:

In punt Schema hoofdmenu Verduistering bevat de opdracht Zoek het schemasymbool(ook verkrijgbaar bij Ctrl+F12). Wanneer u deze opdracht oproept, verschijnt er een dialoogvenster waarmee u snel de definitie van de gewenste functie kunt vinden. We hebben bijvoorbeeld een functie gedefinieerd in het broncodebestand vierkante meter, respectievelijk als ze zich in het veld bevinden Voer het symboolvoorvoegsel in: dialoogvenster openen vierkante meter, dan in het veld Bijpassende symbolen de functie die in de code is gedefinieerd, verschijnt vierkante meter:

Als van het veld Bijpassende symbolen Als u deze functie selecteert, verplaatst de cursor in de editor automatisch naar de plaats waar deze is gedefinieerd. Laten we aannemen dat we meerdere bestanden met broncode hebben en dat in elk bestand een functie is gedefinieerd vierkante meter. Vervolgens moet u naast de functie zelf ook een bestand selecteren. Gebruik hiervoor het formulier Definities, waarin, na het selecteren van een functie, informatie over opties voor de definitie ervan uit verschillende bestanden wordt geplaatst:

Interpretatie

Wanneer de code is geschreven, wilt u deze controleren, bijvoorbeeld door deze op een tolk uit te voeren Schema. Inpluggen SchemaScript biedt hiervoor ook mogelijkheden. Allereerst dit punt Schema hoofdmenu Verduistering, met opdrachten voor het selecteren van de gewenste tolk en het besturen ervan: start, herstart en stop (nodig als de applicatie vastloopt, bijvoorbeeld een eeuwige lus. Omdat Schema kan staartrecursie optimaliseren, een eeuwige lus is echt eeuwig).

De figuur toont opties voor het kiezen van een tolk. Allereerst dit - Externe tolk- verbindt een externe tolk die op dezelfde machine is geïnstalleerd als Verduistering. Tolken Schema nu veel, onder ramen je kunt bijvoorbeeld gebruik maken van Chez-regeling.

Ingebedde Kawa- bij de levering inbegrepen SchemaScript tolk Kawa. Wordt onder auspiciën ontwikkeld GNU op Java raamwerk voor het implementeren van dynamische talen op hoog niveau, waarvan de code wordt gecompileerd Java-bytecode. Maakt het gemakkelijk te gebruiken in code Schema Java-klassen en daarom goed als scripttaal. Naast de tolk bevat het ook een compiler, waardoor het kan worden gebruikt als volwaardige taal voor JVM hoe ze worden gebruikt Scala, Groovy En Clojure. Sommige liefhebbers gebruiken Kawa voor het ontwikkelen van applicaties die op het platform draaien Android.

Tolk op afstand- hiermee kunt u als tolk een speciale server selecteren die op een andere machine draait. Op een instituut kun je bijvoorbeeld bij het lesgeven in programmeren een speciale server opzetten die kan tolken Schema-code. Interactie SchemaScript en deze tolk zal via het netwerk worden uitgevoerd.

SISC-tolk- ingebouwd VERV van Tweede tolk van de schemacode- geschreven in Java tolk Schema.

Na het selecteren van een actieve tolk bijvoorbeeld Kawa, moet het worden gestart met de juiste menuopdracht of knop in het paneel Snel starten:

Een groep opdrachten wordt rechtstreeks gebruikt om delen van de code ter interpretatie te verzenden Eval vanuit het contextmenu van de code-editor:

Deze groep bevat de volgende opdrachten:

Eval topuitdrukking- voer de expressie op het hoogste niveau uit ten opzichte van de expressie waarin de cursor zich bevindt. Als de cursor vóór het laatste haakje staat, zie de afbeelding

en dit commando wordt uitgevoerd, de functiedefinitie wordt in de interpreter geladen vierkante meter.

Evalueer de vorige uitdrukking- voer de vorige uitdrukking uit ten opzichte van de cursor. Als in het voorbeeld

voer deze opdracht uit, de expressie wordt in de tolk geladen (*xx), die hij niet zal kunnen vervullen, omdat parameter X ongedefinieerd:

Bestand in tolk laden- laad het bestand in de tolk, d.w.z. voer de volledige inhoud van het bestand uit in de tolk.

Laten we naar een voorbeeld kijken: er is code voor een functie die berekent N- e Fibonacci-getal. We willen het vierde Fibonacci-getal berekenen:

Als u de opdracht uitvoert Evalueer de vorige uitdrukking na (fib 4), dan wordt er een fout gegenereerd: de tolk kent de definitie van de functie niet jokken:

Als u de opdracht uitvoert Bestand in tolk laden, en dan - Evalueer de vorige uitdrukking, dan zal de berekening correct verlopen:

Steun Kawa VERV

Lees-eval-print-lus (REPL)- een eenvoudige interactieve programmeeromgeving, in deze omgeving kan de gebruiker uitdrukkingen invoeren die onmiddellijk worden berekend, en de berekeningsresultaten worden aan de gebruiker getoond.

Deel Kawa een dergelijke omgeving is inbegrepen. U kunt bijvoorbeeld een functie rechtstreeks in de console definiëren terwijl de tolk actief is som en bereken de waarde ervan ten opzichte van enkele argumenten (elke regel wordt behandeld als één uitdrukking):

Daarnaast is er ook nog het uitzicht Kawa-stapelspoor, waarmee u de status van de call-stack kunt controleren tijdens het debuggen. Om te begrijpen hoe we dit moeten gebruiken, gaan we een fout simuleren. Roep bijvoorbeeld een functie aan die het kwadraat van een getal berekent op basis van het argument "ss":

Kawa zal de waarde van deze expressie niet kunnen evalueren en zal een typeconversiefout weergeven:

De stacktrace ziet er als volgt uit:

Indien ingedrukt in het formulier Kawa-stapelspoor knop Alleen schemaframes weergeven, dan wordt de volledige stacktrace weergegeven, inclusief uitzonderlijke situaties in de geschreven code Java, en niet alleen maar Schema:

Instellingen

Inpluggen SchemaManier is een redelijk flexibele uitbreiding voor de ontwikkelomgeving Verduistering. Om al zijn mogelijkheden te begrijpen, moet u zeker de instellingen overwegen. De instellingenboom begint met een groep Schema:

Op de pagina Schema De volgende instellingen zijn beschikbaar:
- Weergegeven tabblad met- hiermee kunt u de breedte (in spaties) instellen voor het weergeven van het tabteken. Dit werkt alleen als het team tabbladen normaal gesproken niet vervangt door spaties.
- Structurele bewerking inschakelen- het selectievakje is verantwoordelijk voor het in-/uitschakelen van de gestructureerde editor Schema. De gestructureerde editor werkt niet met symbolen, maar met volledige S-uitdrukkingen. Die. Door backspace Zo wordt bijvoorbeeld de gehele S-expressie in één keer verwijderd. Wanneer u een haakje opent, wordt er ook onmiddellijk een gekoppeld sluitend haakje toegevoegd.
- Redden... En Laden... kunt u instellingen opslaan en omgekeerd - laden SchemaScript naar Van .epf-dien een ... in.

Bladzijde Verschijning is verantwoordelijk voor het uiterlijk van de redacteur. Hiermee kunt u de kleur instellen waarmee de gekoppelde beugel wordt gemarkeerd (groep Overeenkomend haakje), achtergrondkleur van de editor (group Achtergrond) en kleuren die worden gebruikt voor syntaxisaccentuering (group Voorgrond).

De afbeelding hierboven toont een voorbeeld van het instellen van de kleur blauw voor stringconstanten.

Bladzijde Opmerkingen is verantwoordelijk voor het weergeven van opmerkingen. Het bevat de volgende instellingen:
- Voorvoegsel voor opmerkingen- voorvoegsel waarmee de opmerking begint. Standaard - twee puntkomma's ( ;; ).
- Inhoud auteursveld- inhoud van het veld Auteur, hiermee kunt u de voor-/achternaam van de auteur van de code opgeven.
- Inhoud van het auteursrechtveld- Met de inhoud van het veld Copyright kunt u copyrightinformatie opgeven.
- Automatisch doorgaan met commentaar vanaf de vorige regel- als dit selectievakje is aangevinkt, dan wanneer u op drukt Binnenkomen na een commentaar op een nieuwe regel gaat het commentaar verder, d.w.z. nieuwe regel begint met ;; .

Bladzijde Snelle evaluatiesleutels Hiermee kunt u opdrachten opgeven (d.w.z. namen Schema-functies) die worden uitgevoerd wanneer de overeenkomstige toetsenbordcombinaties worden ingedrukt. Standaard voor iedereen Toets voor snelle evaluatie 0...9 komt overeen met de toetscombinatie Alt-K, 0...9. Wanneer een plug-in actief wordt gebruikt, vormt elke ontwikkelaar een reeks namen van methoden die hij voortdurend aanroept (bijvoorbeeld de method test, om wat testcode uit te voeren). Dienovereenkomstig kan het aanroepen van deze methoden worden toegewezen aan sneltoetsen.

Bladzijde Inspringing dient voor het configureren van inkepingen die zijn toegevoegd bij het schrijven/formatteren van code. Voor elk trefwoord kunt u de inspringingsinstelling opgeven die op de argumenten wordt toegepast. De instellingentabel is als volgt ingedeeld: in de kolom Symbool er is een trefwoord opgegeven waarvoor de inspringingen zijn geconfigureerd. Kolom Inspringschema specificeert het inspringschema. De schema's zijn als volgt:
- standaard- alle subuitdrukkingen worden uitgelijnd onder het eerste teken van hun omringende uitdrukking.
- definitie- alle subexpressies zijn uitgelijnd als een frame-expressie + 2 spaties (vergelijkbaar met formulierontwerp definiëren).
- als- alle subuitdrukkingen zijn uitgelijnd als een kaderuitdrukking + 4 spaties (vergelijkbaar met formulierontwerp als).
- geen- geen inspringing, alle subexpressies worden op dezelfde manier uitgelijnd als de omringende expressie.
- met- de meest complexe vorm van uitlijning, gebruikt voor functies met lange namen en/of een grote lijst met parameters. Eerst N-parameters zijn ingesprongen met 4 spaties, de rest - met 2 spaties Tip stelt de waarde in N. Een voorbeeld van het gebruik van dit formulier is trefwoorduitlijning laten:

Bladzijde Tolk Hiermee kunt u instellingen instellen voor code-interpretatie en parsering. Tot nu toe zijn er twee van dergelijke instellingen: - Als het selectievakje is aangevinkt, wordt het bestand opgeslagen voordat het ter interpretatie wordt verzonden. Voorkomt dat u eraan hoeft te denken wijzigingen op te slaan voordat u ze interpreteert.
- Omring expressies met (begin...)- of geïnterpreteerde uitdrukkingen in het formulier moeten worden ingekaderd (beginnen...). Zoals ik het begrijp, is deze optie nodig om met sommige tolken te werken die slechts één S-expressie tegelijk kunnen uitvoeren.

Bladzijde Externe tolk Hiermee kunt u opgeven welke externe tolk u wilt gebruiken. U kunt de volgende opties instellen:
- Naam tolk- naam van de tolk
- Opdrachtregel- een opdrachtregel, inclusief het volledige pad naar de tolk en enkele opties die deze nodig heeft om te werken.
- Werkmap- de werkmap van de tolk is de map ten opzichte waarvan de bestandspaden worden berekend.
- Fout Regexp- reguliere expressie voor het parseren van fouten. De tolk produceert foutmeldingen in een aantal van zijn eigen formaten, SchemaScript moet uit deze regel met fouten weten hoe u informatie over de locatie van de fout in de broncode kunt extraheren. Bijvoorbeeld voor Kawa Deze reguliere expressie is: [\t ]+op [^(]+\(((.+):(+))\).

De afbeelding hierboven toont een externe tolk die in de console draait chez-schema.

Bladzijde Tolk op afstand bevat instellingen voor verbinding met een tolk op afstand - een tolk die als server draait en naar een specifieke poort luistert. Dienovereenkomstig kunt u op deze pagina de hostnaam en poort opgeven waarop deze externe tolk draait.

Bladzijde Lexicale extensies dient om lexicale extensies te beheren Schema. Bevat twee items:
- Behandel haakjes ( of ()) als ouders- of gekrulde en vierkante haakjes op dezelfde manier moeten worden behandeld als ronde haakjes. Die. of een paar moet worden gemarkeerd en of de koppeling van haakjes moet worden beheerd.
- Accepteer streepje (#) als identificatieonderdeel- of het gebruik van het hash-symbool als onderdeel van de identificatienaam moet worden toegestaan ​​(zoals ik het begrijp, werkt dit niet voor alle tolken Schema).

Laatste pagina - Syntaxis- hiermee kunt u op flexibele wijze de verwerking van de taalsyntaxis regelen - structuren toevoegen aan en verwijderen uit groepen, wat invloed heeft op de syntaxisaccentuering tijdens het bewerken. Er zijn 5 groepen gedefinieerd op deze pagina:
- Definiëren- definities bevatten trefwoorden waarmee definities beginnen, bijvoorbeeld - definiëren.
- Speciale namen- speciaal genoemde parameters, zoals #!sleutel of #!rest.
- Speciale vormen- speciale vormen, zoals als, En, laten enz. In feite - het grootste deel van de trefwoorden van een programmeertaal.
- Mutator- mutatoren, d.w.z. functies die van status veranderen. Worden anders gemarkeerd dan functies die niet van status veranderen.
- Constante- constanten zoals #!evan, #!nul etc. Je kunt ook toevoegen #T En #F.

U kunt aan elke groep uw eigen elementen toevoegen, maar ook bestaande elementen verwijderen. Dit is erg handig als u er zelf een ontwikkelt DSL op de basis Schema en ermee werken in de editor. Naast het expliciet toevoegen van varianten, kunt u binnen elke groep een reguliere expressie opgeven die overeenkomt met de leden ervan.

Dit is wat er gebeurt als je het aan een groep toevoegt Definiëren trefwoord pavel:

Conclusie

We hebben gekeken naar een veelzijdige en zeer aanpasbare tool voor ontwikkeling in een programmeertaal Schema in de leefomgeving Verduistering. Met deze tool kunt u de broncode bewerken en communiceren met een breed scala aan tolken, inclusief ingebouwde en externe tolken. Als we de mogelijkheden van deze plug-in vergelijken met ontwikkeltools op Schema bijvoorbeeld onder Emacs, dan zijn ze behoorlijk vergelijkbaar (behalve de afwezigheid van zulke kleine dingen als het vervangen van het zoekwoord lambda naar het symbool van de Griekse letter lambda). Elke programmeur die het niet onder de knie wil krijgen Emacs kan gebruiken Verduistering om aan de slag te gaan met functioneel programmeren of een taal Schema, evenals voor het oplossen van problemen en oefeningen uit SICP. Misschien is iemand ook geïnteresseerd in het onderwerp ontwikkeling Schema onder JVM gebruik makend van Kawa.

Ik wil graag de auteur bedanken SchemaScript - Dominique Boucher, die dit hulpprogramma gratis ontwikkelt. Het is vermeldenswaard dat de plug-in SchemaScript is een open source-project en elke programmeur kan helpen het te ontwikkelen door de functies toe te voegen die hij nodig heeft.

Z.Y. De gedachte ontstond dat hetzelfde Schema het is moeilijk om te studeren omdat het niet interessant is - er zijn geen interessante taken. Gewone wiskundige berekeningen zijn oninteressant, en zelfs eenvoudig werk met afbeeldingen vereist bijvoorbeeld een platform en bibliotheken. Het is interessanter om een ​​taal te leren door deze op een bepaald vakgebied toe te passen. Dus, SchemeScript + Kawa + Eclipse kan worden gebruikt als leerplatform. Zie voorbeelden van SchemaScript(in het jar-bestand de directory voorbeelden), er zitten een aantal behoorlijk interessante tussen.

Zoals gewoonlijk kunt u uw opmerkingen achterlaten of vragen stellen aan de programmeur van Severe Chelyabinsk.

Ik vond het bericht leuk -

Invoering

Bij het ontwikkelen van Scheme lag de nadruk op elegantie en eenvoud van de taal. De filosofie van de taal is nadrukkelijk minimalistisch. Het doel is niet om verschillende nuttige constructies en hulpmiddelen op één hoop te gooien, maar integendeel om zwakheden en beperkingen weg te nemen die het toevoegen van nieuwe functies aan de taal noodzakelijk maken. Als gevolg hiervan bevat Scheme een minimum aan primitieve constructies en kun je alles uitdrukken wat je wilt door erop voort te bouwen. We kunnen er bijvoorbeeld op wijzen dat de taal twee mechanismen gebruikt voor het organiseren van loops:

  1. "residuele" of "staart" recursie staart recursie)
  2. iteratieve benadering (die tijdelijke variabelen gebruikt om een ​​tussenresultaat op te slaan).

Scheme was het eerste Lisp-dialect dat uitsluitend gebruik maakte van statische (in plaats van dynamische) variabele scoping, optimalisatie van staartrecursie waarborgde en Booleaanse gegevenstypen (#t en #f ondersteunde in plaats van de traditioneel onhandige T en NIL). Het was ook een van de eerste talen die rechtstreeks werd ondersteund voortzetting(Engels) voortzettingen). Sinds de R^5RS-specificatie heeft de taal een uitzonderlijk krachtige en handige manier gekregen om macro's op een “hygiënische” manier te schrijven op basis van syntactische transformatiepatronen. hygiënische_macro). De regeling implementeert ook “afvalinzameling”. afvalinzameling), dat wil zeggen het automatisch vrijgeven van geheugen van objecten die niet langer worden gebruikt.

De taal gebruikt lijsten en eendimensionale arrays (“vectoren”) als basisdatastructuren. In overeenstemming met het verklaarde minimalisme is er (nog) geen standaardsyntaxis voor het ondersteunen van structuren met benoemde velden, evenals OOP-tools - dit alles kan door de programmeur naar eigen voorkeur worden geïmplementeerd, hoewel de meeste taalimplementaties kant-en-klare mechanismen bieden .

Uit curiositeit kan worden opgemerkt dat de oorspronkelijke naam van de taal Schemer werd gewijzigd in de huidige naam vanwege de toenmalige beperking van de lengte van bestandsnamen in ITS.

Voorbeelden

Eenvoudige wiskundige bewerkingen

(+ 2 (* 2 2 ) ) (+ 1 2 3 4 )

Elke bewerkings- (of functie-)aanroep wordt weergegeven als een lijst, waarin het bewerkingssymbool (dat in wezen de naam van de functie is) altijd de startpositie inneemt.

Typ predikaten

(nummer? 5 ) (nummer? "foo" ) (string ? "foo" )

Volgens afspraak eindigen de namen van alle predikaten met het symbool? .

Gelijkheidscontroles

(eq? "foo" "bar" ) (eq? 5 (+ 2 3 ) ) (eq? (eq? 2 3 ) (eq? 3 4 ) )

Macro's definiëren voor traditionele push/pop-bewerkingen

(definieer syntaxis push! (syntaxisregels () ((push! x l ) (set! l (nadelen x l ) ) ) ) (definieer syntaxis pop! (syntaxisregels () ((pop! l ) (let ( (x (auto l ) ) ) (set! l (cdr l ) ) x) ) ) )

Functies definiëren

;; faculteit in (inefficiënte) recursieve stijl(definieer (feit x) (als (< x 3 ) x (* (fact (- x 1 ) ) x) ) ) ;; Fibonacci-functie - vereist dubbele recursie(definieer (fib n) (cond ((= n 0 ) 0 ) ((= n 1 ) 1 ) (anders (+ (fib (- n 1 ) ) (fib (- n 2 ) ) ) ) ) ;; som van lijstelementen in typische schemastijl ;; (de lushelperfunctie drukt een lus uit met behulp van ;; staartrecursie en accumulatorvariabele)(definieer (somlijst x) (laat lus ((x x) (n 0 ) ) (if (null? x) n (lus (cdr x) (+ (auto x) n) ) ) ) (feit 14) (fib 10 ) (som "(6 6 6 100 ) ) (som (kaart fib "(1 2 3 4 ) ) )

De functiedefinitie moet voldoen aan het volgende prototype:

(definieer functienaam (lambda (argumentlijst) (functie_implementatie) ) ),

hoewel in de praktijk vaker de verkorte vorm wordt gebruikt:

(define (functie_naam argumenten) (functie_implementatie) ) .

Invoer uitvoer

(schrijven (+ (lezen) (lezen)))

Koppelingen

Russische taallinks

Engelse links

Leerboeken in het Engels

  • Videolezingen “Structuur en interpretatie van computerprogramma’s”, Harold Abelson en Gerald Jay Sussman
  • De Scheme-programmeertaal, R. Kent Dybvig

Wikimedia Stichting. 2010.

Kijk wat "Schema (programmeertaal)" is in andere woordenboeken:

    Een programmeertaal is een formeel tekensysteem dat is ontworpen voor het schrijven van computerprogramma's. Een programmeertaal definieert een reeks lexicale, syntactische en semantische regels die het uiterlijk van het programma en de acties definiëren, ... ... Wikipedia