Vorrang der Includes?

Begonnen von Tapio, Mittwoch, 5. März 2025, 12:19

« vorheriges - nächstes »

Tapio

Hallo zusammen,

in einer Vorlage nutze ich einige Includes mit relativen Pfaden (nur Dateinamen). GUI ist Frescobaldi.

\include "global.ily"
In den Frescobaldi-Optionen ist ein "Lilypond Include-Verzeichnis" definiert, dort wird o.g. Datei gefunden.

Nun will man manchmal Änderungen im Include-Teil machen, die sich nicht auf andere Projekte auswirken. Also entweder den Include-Teil einfach in die .ly einfügen oder include kopieren und dies dann nehmen.

Jetzt habe ich mir gedacht, ich kopiere o.g. globals.ily einfach in das Verzeichnis, in dem die .ly liegt. Doch Pustekuchen, die globals.ily im Include-Verzeichnis hat Vorrang. Unerwartet, finde ich.

Kann ich das Verhalten beeinflussen? Also umgekehrter Vorrang?

Danke!

===============
Noch zu mir. Ich freue mich, dass ich hier schreiben kann. Danke. Leider ist die Lily-Community eher leise. Ich habe bspw. mehrere Posts auf Facebook nach "Gnu Lilypond" abgesetzt, die werden einfach nicht freigeschaltet. Es ist sinnlos, erst 5 Tage warten zu müssen.

Ich spiele in einem Klarinetten-Ensemble einer Musikschule und kann da das Setzen von Noten gebrauchen. Habe meine ersten Vorlagen sehr schön vorbereitet. Da werde ich wohl immer dran feilen. Auch an der Art, die Noten niederzuschreiben, man will ja einen guten Überblick behalten und Noten/Fehler schnell finden.

Demnächst will ich etwas mehr in Scheme machen, mal sehen, was ich so brauche. Diese Art der funktionalen Programmierung kenne ich, habe mal mit Haskell gearbeitet.

Lilysetter

Ich mache kein Frescobaldi.  probier mal
\include "./global.ily" oder \include ".\global.ily"
oder halt den absoluten Pfad angeben.  Oder was mit Umgebungsvariablen.

> "Demnächst will ich etwas mehr in Scheme machen, mal sehen, was ich so brauche."
Ich würde erst mal alle vorhandenen Möglichkeiten von Lilypond lernen und nutzen.
Immer wieder die sehr umfangreiche Dokumentation lesen, dort steht eigentlich alles drin.

Haskell ist schon mal eine gute Voraussetzung.
Ich tue mich nach 10 Jahren immer noch schwer mit diesen "modernen Sprachen" und speziell mit Lilypond.
Bin halt schon ein alter Knacker, der mit klassischer Programmierung aufgewachsen ist.
Speziell die Kontexte machen mir zu schaffen.  :-)   Da ist viel Probieren (trial and error) angesagt.
Oft komme ich nur durch Zufall auf die "richtige" Lösung, oder zumindest eine, die funktioniert.
Wobei unklar ist, was denn "richtig" ist.

Tapio

Hallo Lilysetter, .\ klappt auch nicht, das ist jedenfalls nicht relativ vom Speicherverzeichnis der Hauptdatei. Ich teste das nicht weiter, habe jetzt andere Strategien. a) in der Vorlage erstmal alles beinhalten und dann nach den ersten Eintragungen zu Include machen (geht in Frescobaldi sehr einfach) b) die globalen Includes benenne ich konsequent #*.ily. Wenn ich sie zu einem lokalen Include mache, kopiere ich sie und benenne sie um, nehme das "#" weg. Fetig, aus die Maus.

Scheme, das war erstmal echt hart ein Ergebnis zu bekommen. Die ganzen tollen Anleitungen sind ja sehr verständlich für einen Programmierer, aber das dann in Lily unterzubringen, ist eine andere Sache. Genau. "Was ist der Kontext" scheint irgendwie ein Ding zu sein. Ist etwas Musik, Text, oder wasweißich.

Wie bei TeX, wenn man mal etwas anders machen will, wird es schwierig, weil diese Systeme es ja besser wissen. Ich habe vor, dass auf einer mehrseitigen Partitur oder auch den Einzelstimmen Titel oder Untertitel, oder Opus, weiß noch nicht, auf jeder Seite erscheinen.

Was nutzt Du denn - Visual Studio Code? Ich mag es ja ganz gerne, aber es gab irgendwie Probleme mit dem Lily Einrichten, dass ich irgendwann aufgegeben habe.

Tapio

Scheme geht mir jetzt schon auf den Geist. Ich würde gerne ein paar Flags setzen und so bspw. steuern, ob Dinge angezeigt werden oder nicht. Doch schon hier falle ich auf die Nase.

#(if (> 2 1)
    (define InstrumentName "Test")
    (define InstrumentName "")
)

Meiner Theorie nach sollte danach in Lilypond eine Variable \InstrumentName mit "Test" gesetzt sein. Stattdessen wird herumgemault. "source expression failed to match any pattern in form (define (InstrumentName "Test"))"

Manuela

#4
Zitat von: Tapio am Freitag,  7. März 2025, 10:08Scheme geht mir jetzt schon auf den Geist. Ich würde gerne ein paar Flags setzen und so bspw. steuern, ob Dinge angezeigt werden oder nicht. Doch schon hier falle ich auf die Nase.

#(if (> 2 1)
    (define InstrumentName "Test")
    (define InstrumentName "")
)

wird durchgeführt, somit wird eine Variable namens InstrumentName mit dem Inhalt "Test" definiert.

Meiner Theorie nach sollte danach in Lilypond eine Variable \InstrumentName mit "Test" gesetzt sein. Stattdessen wird herumgemault. "source expression failed to match any pattern in form (define (InstrumentName "Test"))"

Willkommen im Klub! Ich nehme an, du hast Erfahrung mit Programmieren? Scheme ist sehr gewöhnungsbedürftig, ich plage mich noch immer damit, vor allem, wenn ich mich lange nicht mehr damit beschäftigt habe. Die einfachsten Grundlagen habe ich inzwischen intus.

Scheme dient zur Abarbeitung von Listen. In dem von dir angeführten Beispiel
(if (> 2 1)das bedeutet, wenn der erste Ausdruck größer ist als der zweite, also in deinem Fall wenn 2 > 1 wahr ist, dann wird der erste Klammerausdruck als Ergebnis zurückgegeben, also
(define InstrumentName "Test")wird ausgeführt, es wird eine Variable namens InstrumentName mit dem Inhalt "Test" erstellt.

Hier habe ich versucht, ein paar wichtige Dinge zum Thema Scheme zusammenzufassen inkluse ein paar hilfreichen Links. Wobei ich kein Scheme-Guru bin, es kann also durchaus sein, dass Fehler enthalten sind.
Danke für eure Hilfe
viele Grüße
-- Manuela

Tapio

Soweit schon klar, ich bekomme nur die Variablenbelegung innerhalb von Scheme nicht hin.

Das hier funktioniert hingegen. Also die Variable in Lily definieren, mit einem Wert aus Scheme:

InstrumentName = #(if (< 2 1)
    "Test"
    "Klappt"
)

Ziel ist dies: Ich will in meiner Partiturvorlage ein Flag oben einsetzen, wie "Stimme = 3", und im Staff-Part sollen dann nur die Staffs entsprechend der Stimme genommen werden. Bei "0" dann alle, also Partitur drucken. Von der Logik alles sehr simpel, auch (short)instrumentName müssen gesetzt werden, aber praktisch vermutlich schwierig.

Tapio

Juhuu, ein Anfang. Man sammelt sich so langsam alles zusammen. Diese Variablenbelegung funktioniert.

Stimme = 1

InstrumentName = #(cond
    ((= Stimme 4) "Bass-Klarinette")
    ((= Stimme 0) "")
    (else (string-append "Klarinette " (number->string Stimme)))
)

Sehe ich das richtig? Scheme schickt quasi einen String zurück, der dann im Lilypond-Quellcode an der Stelle, wo er eingesetzt wird, syntaktisch passen muss? Könnte ich also theoretisch versuchen, Scheme dies hier an der passenden Stelle zurückgeben zu lassen?

"\new Staff \with {...}

Manuela

Zitat von: Tapio am Freitag,  7. März 2025, 11:11Sehe ich das richtig? Scheme schickt quasi einen String zurück, der dann im Lilypond-Quellcode an der Stelle, wo er eingesetzt wird, syntaktisch passen muss? Könnte ich also theoretisch versuchen, Scheme dies hier an der passenden Stelle zurückgeben zu lassen?

Genauso würde ich es sehen (Harm, bitte korrigiere, wenn ich mich irre).

Ansonsten: probieren geht über studieren, mehr als dass Lilypond eine Fehlermeldung ausgibt, kann nicht passieren.
Danke für eure Hilfe
viele Grüße
-- Manuela

Tapio

#8
Zitat von: Manuela am Freitag,  7. März 2025, 11:19Genauso würde ich es sehen (Harm, bitte korrigiere, wenn ich mich irre).

Zeilen dynamisch auskommentieren geht schon mal nicht, wie ich mir das vorstelle.

Ich habe mal das hier einer Zeile vorangestellt:

#(if (= 0 0) "%")
Diese Zeile wurde trotzdem verwendet.

Manuela

Zitat von: Tapio am Freitag,  7. März 2025, 11:49Zeilen dynamisch auskommentieren geht schon mal nicht, wie ich mir das vorstelle.

Das kann nicht gehen, ich glaube, Lilypond und Scheme kommunizieren über Variable, da war mein voriger Kommentar Unsinn.

Vielleicht hilft dir diese Doku weiter (kennst du vermutlich eh schon)
Danke für eure Hilfe
viele Grüße
-- Manuela

Tapio

#10
Nur mal vom Grundgerüst habe ich so die Stimmen dynamisch hingekriegt. Etwas viele Variablen, man muss mit der Reihenfolge aufpassen - und sicher nicht gerade elegant, aber ein Anfang.

Auskommentieren wäre natürlich auch gegangen. :D

Ich gebe also die Stimme an (0 bis 4, 0=Alle, 4 = Bass) und es soll automatisch die Stimme oder eine Partitur ausgegeben werden. Der Titel muss etwas dynamisch sein und eben die Instrumentenangaben in den einzelnen Zeilen (braucht man für eine Einzelstimme ja nicht). Desweiteren müssen die Einrückungen etwas anders sein.

Das sind ja alles nette Automatisierungen, aber wie ich mich kenne, am Ende gehe ich davon wieder weg und trage die Dinge flach rein, wie sie sind :D

Stimme = 0

KI_N = #(if (= Stimme 0) "Klarinette 1") KI_SN = #(if (= Stimme 0) "Kl.1")
KII_N = #(if (= Stimme 0) "Klarinette 2") KII_SN = #(if (= Stimme 0) "Kl.2")
KIII_N = #(if (= Stimme 0) "Klarinette 3") KIII_SN = #(if (= Stimme 0) "Kl.3")
KB_N = #(if (= Stimme 0) "Bass-Klarinette") KB_SN = #(if (= Stimme 0) "Bass")

STAFF_I   = \new Staff = "K1" \with {midiInstrument = "clarinet" instrumentName = \KI_N shortInstrumentName = \KI_SN } \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-I }
STAFF_II  = \new Staff = "K2" \with {midiInstrument = "clarinet" instrumentName = \KII_N shortInstrumentName = \KII_SN} \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-II }
STAFF_III = \new Staff = "K3" \with {midiInstrument = "clarinet" instrumentName = \KIII_N shortInstrumentName = \KIII_SN } \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-III }
STAFF_IV  = \new Staff = "BK" \with {midiInstrument = "clarinet" instrumentName = \KB_N shortInstrumentName = \KB_SN } \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-BKL }
STAFF_I = #(if (or (= Stimme 0) (= Stimme 1)) STAFF_I "")
STAFF_II = #(if (or (= Stimme 0) (= Stimme 2)) STAFF_II "")
STAFF_III = #(if (or (= Stimme 0) (= Stimme 3)) STAFF_III "")
STAFF_IV = #(if (or (= Stimme 0) (= Stimme 4)) STAFF_IV "")

\bookpart {
  % \header {piece = "Allemande."}
  #(set-global-staff-size 20)
  \score {
    << % More: [\new StaffGroup/GrandStaff/ChoirStaff = "Ensemble"] <<
      \new ChoirStaff = "Ensemble" <<
        \STAFF_I
        \STAFF_II
        \STAFF_III
        \STAFF_IV
      >>
    >>
    \layout { } \midi { }
  }
}

Manuela

Es gab im alten Forum einen Thread "variable Variablennamen".

Ich habe zum Glück rechtzeitig folgenden Code gesichert:
\version "2.20.0"
\language "deutsch"

myTitel="Die lustigen Hammerschmiedgselln"

mus = \relative c'' { c4 c8 c }

%% Variablen für 1. und 2. Stimmen
#(ly:parser-include-string (string-append "\"m" myTitel "1\"")) = \mus

#(ly:parser-include-string (string-append "\"m" myTitel "2\"")) = \transpose c c, \mus

%% Variable für Akkordbezeichnungen
#(ly:parser-include-string (string-append "\"c" myTitel "\"")) =
\chordmode { \mus }

%% Texte für Strophen 1+2
#(ly:parser-include-string (string-append "\"l" myTitel "1\"")) = \lyricmode {
  \set stanza = #"1."
  Stro -- phe I
}

#(ly:parser-include-string (string-append "\"l" myTitel "2\"")) = \lyricmode {
  \set stanza = #"2."
  Stro -- phe II
}

\paper {
  print-all-headers = ##t
}

\score
{
  <<
    \new Staff="leadsheet" \with {
    }
    <<
      \tocItem \markup #myTitel
      <<
        \context Voice="melody" {
          \voiceOne
          #(ly:parser-include-string (string-append "\\\"m" myTitel "1\""))
        }
        \context Voice="sndvoice"

        { \voiceTwo #(ly:parser-include-string (string-append "\\\"m" myTitel "2\"")) }
      >>
      \new Lyrics \lyricsto "melody" {
        #(ly:parser-include-string (string-append "\\\"l" myTitel "1\""))
      }
      \new Lyrics \lyricsto "melody" {
        #(ly:parser-include-string (string-append "\\\"l" myTitel "2\""))
      }
    >>
    \context ChordNames
    { #(ly:parser-include-string (string-append "\\\"c" myTitel "\"")) }
  >>
  \header {
    title = #myTitel
    poet = ""
    composer = \markup {
      \override #'(baseline-skip . 1)
      \right-column {
        "Text: Volkslied"
        "Melodie: Volksweise"
      }
    }
    piece = ##f
    opus = ##f
  }
}

%% ... und dann noch der Liedtext als Markup
\version "2.20.0"
\language "deutsch"

MUSIC = \relative c' { f4 g f e d1 }
TEXT = "Piece 1"

%% Definition als SCHEME-Symbol
pointermusic = #'MUSIC
pointertext = #'TEXT
%% Definition als String
pointermusicx = "MUSIC"
pointertextx = "TEXT"

koso =
#(define-scheme-function (mus text)
   (symbol? symbol?)
   #{
     \score {
       \header {
         title = "Variablen als SCHEME-Symbols"
         piece = #(module-ref (current-module) text)
       }
       \new Staff {
         #(module-ref (current-module) mus)
       }
     }
   #})

\paper {
  print-all-headers = ##t
}

xoso =
#(define-scheme-function  (mus text)
   (string? string?)
   #{
     \score {
       \header {
         title = "Variablen als Strings"
         piece = #(module-ref (current-module) (string->symbol text))
       }
       \new Staff { #(ly:parser-include-string (string-append "\\" mus )) }
     }
   #})

\koso \pointermusic \pointertext
\xoso \pointermusicx \pointertextx

Vielleicht hilft dir ja etwas davon weiter.
Danke für eure Hilfe
viele Grüße
-- Manuela

Tapio

#12
Re: "Es gab im alten Forum einen Thread "variable Variablennamen""

Danke, habe reingeguckt aber es bisher nicht genug verstanden, dass es mir nützen könnte.

Hier einfach mal meine Vorlage für Partitur oder Einzelstimme zum Drübergucken oder Inspiration. Müsste bei Euch laufen. Setzt also quasi automatisch ein paar Einstellungen anders bei Partitur oder Einzelstimme.

\version "2.25.24" \language "english"

PrintVoice = 1 % 1-4 Einzelstimmen | 0 = Alle/Partitur

PieceSettings = { \key c \major \time 4/4 \tempo "Allegro" 4=120 }

Noten-I = {
  \repeat unfold 20 {c4-. g8-. g4->( a8) d4}
}
Noten-II = {
  \repeat unfold 20 {d2-.( a8-.) f4-> b8 }
}
Noten-III = {
  \repeat unfold 20 {e4-. e8-. c2->( d8) }
}
Noten-IV = {
  \repeat unfold 20 {c8-. g2-. a8 d4}
}

\header { % dedication = "" piece = "" subsubtitle = "" opus = "" arranger = ""
  composer = "Composer"
  title = "Work"
  tagline = \markup { \concat { "Work, Op. 0815 - " \Date } }
  instrument = #(cond ((= PrintVoice 0) "") ((= PrintVoice 4) "Bass-Klarinette") (else (string-append "Klarinette " (number->string PrintVoice))))
}

\paper {
  #(set-paper-size "a4")
  print-page-number = ##t
  print-first-page-number = ##f
  print-all-headers = ##f
  indent = #(if (= PrintVoice 0) 14 0)
  short-indent = #(if (= PrintVoice 0) 0 0)
  % top-margin = 10
  % bottom-margin = 10
  % right-margin = 0
  % horizontal-shift = 10
  % ragged-right = ##f
  ragged-last = ##f
  ragged-bottom = ##t
  ragged-last-bottom = ##t
  % top-system-spacing = #'((minimum-distance . 10))
  % last-bottom-spacing = #'((minimum-distance . 10))
  % system-system-spacing =
  %   #'((basic-distance . 12)
  %      (minimum-distance . 8)
  %      (padding . 1)
  %      (stretchability . 60))
  % page-count = 2     % FORCE
  % system-count = 2   % FORCE
}

\layout {
  \context {
    \Score
    %  \remove "Bar_number_engraver"
  }
  \context {
    \Staff
    %  \remove "Clef_engraver"
    %  \remove "Time_signature_engraver"
    %  \remove "Bar_engraver"
  }
}

EnsGlobalStaffSettings = {
  \transposition b
  % % % % % % % % % % % % % % % % % % % % % %
  % Takt
  %
    \override Score.BarNumber.break-visibility = #end-of-line-invisible
  % \override Score.BarNumber.self-alignment-X = #CENTER
  % \set Score.barNumberVisibility = #(modulo-bar-number-visible 5 1)
    \set Score.barNumberVisibility = #(every-nth-bar-number-visible 5)
  % \set Score.barNumberVisibility = #all-bar-numbers-visible
  % \set Score.measureBarType = #"'"
  % % % % % % % % % % % % % % % % % % % % % %
  % Übungsmarke
  %
  % \set Score.rehearsalMarkFormatter = #format-mark-alphabet
    \set Score.rehearsalMarkFormatter = #format-mark-box-alphabet
  % \set Score.rehearsalMarkFormatter = #format-mark-circle-alphabet
  % \set Score.rehearsalMarkFormatter = #format-mark-numbers
  % \set Score.rehearsalMarkFormatter = #format-mark-box-numbers
  % \set Score.rehearsalMarkFormatter = #format-mark-circle-numbers
  %
  % Atemzeichen
  % % % % % % % % % % % % % % % % % % % % % %
    \override BreathingSign.text = #(make-musicglyph-markup "scripts.caesura.curved")
  %
  % % % % % % % % % % % % % % % % % % % % % %
  % Hairpins
  %
    \override Hairpin.minimum-length = #7
  % \override Hairpin.to-barline = ##f
}

STAFF_I   = \new Staff = "K1" \with {midiInstrument = "clarinet" instrumentName = #(if (= PrintVoice 0) "Klarinette 1") shortInstrumentName = #(if (= PrintVoice 0) "Kl.1")} \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-I }
STAFF_II  = \new Staff = "K2" \with {midiInstrument = "clarinet" instrumentName = #(if (= PrintVoice 0) "Klarinette 2") shortInstrumentName = #(if (= PrintVoice 0) "Kl.2")} \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-II }
STAFF_III = \new Staff = "K3" \with {midiInstrument = "clarinet" instrumentName = #(if (= PrintVoice 0) "Klarinette 3") shortInstrumentName = #(if (= PrintVoice 0) "Kl.3")} \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-III }
STAFF_IV  = \new Staff = "BK" \with {midiInstrument = "clarinet" instrumentName = #(if (= PrintVoice 0) "Bass-Klar.") shortInstrumentName = #(if (= PrintVoice 0) "Bass")} \relative c'' { \EnsGlobalStaffSettings \PieceSettings \Noten-IV }

STAFF_I = #(if (or (= PrintVoice 0) (= PrintVoice 1)) STAFF_I)
STAFF_II = #(if (or (= PrintVoice 0) (= PrintVoice 2)) STAFF_II)
STAFF_III = #(if (or (= PrintVoice 0) (= PrintVoice 3)) STAFF_III)
STAFF_IV = #(if (or (= PrintVoice 0) (= PrintVoice 4)) STAFF_IV)

\bookpart {
  % \header {piece = "Anderes Stück."}
  #(set-global-staff-size 20)
  \score {
    << % More: [\new StaffGroup/GrandStaff/ChoirStaff = "Ensemble"] <<
      \new ChoirStaff = "Ensemble" <<
        \STAFF_I
        \STAFF_II
        \STAFF_III
        \STAFF_IV
      >>
      %  \new ChoirStaff = "Strings" <<
      %  \STAFF_I
      %  \STAFF_II
      %  \STAFF_III
      %  \STAFF_IV
      %>>
    >>
    \layout { } \midi { }
  }
}

Diese Zeile hier verwundert mich, sie macht, was ich brauche, aber warum..:

STAFF_I = #(if (or (= PrintVoice 0) (= PrintVoice 1)) STAFF_I)
Wenn die Bedingung nicht eintrifft, wird STAFF_I leer. Aber da ist doch kein Else-Zweig. Sie war ja davor belegt.

martinmagtenor

#13
Das ist jetzt off-topic, aber dennoch:

Zitat von: Lilysetter am Mittwoch,  5. März 2025, 13:37[...]
Ich tue mich nach 10 Jahren immer noch schwer mit diesen "modernen Sprachen" und speziell mit Lilypond.
Bin halt schon ein alter Knacker, der mit klassischer Programmierung aufgewachsen ist.
Speziell die Kontexte machen mir zu schaffen.  :-)  Da ist viel Probieren (trial and error) angesagt.
Oft komme ich nur durch Zufall auf die "richtige" Lösung, oder zumindest eine, die funktioniert.
Wobei unklar ist, was denn "richtig" ist.

Scheme ist keine "moderne" Sprache im Sinn von "jung". Sie ist Mitte der 1970er-Jahre "aus dem Ei" geschlüpft, siehe Timeline of Lisp dialects

Scheme ist alt in dem Sinn, dass in den Befehlen car und cdr noch frühe IBM-Großrechner-Herkunft (über LISP, ca. 1965) durchschimmert.

Aber Scheme ist modern in dem Sinn, dass sie von Anbeginn das immer noch moderne Konzept der funktionalen Programmierung mitbringt, das bei anderen, teilweise deutlich jüngeren Sprachen, erst Jahrzehnte später zum Hype und dann nachgereicht wurde.

Der Verzicht auf syntaktischen Zucker, oder man könnte es auch Reduktion auf das Wesentliche nennen, erschwert durchaus den Umstieg, wenn man von geschwätzigen Sprachen herkommt. Beispielsweise gibt es keine Syntax für Schleifen, kein FOR ... DO oder WHILE ... DO usw. Stattdessen nur Rekursion. Aber gleichzeitig starke Typisierung und keinen Stress mit Speicherverwaltung.

Der Wikipedia-Artikel ersetzt keine ausgefeilte Einführung, ist aber dennoch hilfreich: Scheme ist keine "moderne" Sprache im Sinn von "jung". Sie ist Mitte der 1970er-Jahre "aus dem Ei" geschlüpft, siehe Scheme bei Wikipedia

Ebenfalls nicht zu unterschätzen ist die Mühe, sich mit Scheme als Programmiersprache einerseits und deren Einbettung in das Lilypond-Framework andererseits auseinandersetzen zu müssen. Und die Abgrenzung beider Seiten bei Problemen kann kniffelig sein.

Und auf dieser (und benachbarten) Seite kann man direkt im Browser mit Scheme-Ausdrücken "spielen und probieren": Grundlagen der funktionsorientierten Programmierung mit Scheme

In diesem Sinn: Nur Mut und viel Erfolg!

Martin

Edit/2025-03-15 19:02: Link/Url korrigiert. Danke an Manuela!

Manuela

Zitat von: martinmagtenor am Freitag, 14. März 2025, 22:57Der Wikipedia-Artikel ersetzt keine ausgefeilte Einführung, ist aber dennoch hilfreich:

[url=Scheme ist keine "moderne" Sprache im Sinn von "jung". Sie ist Mitte der 1970er-Jahre "aus dem Ei" geschlüpft,

siehe [url="https://en.wikipedia.org/wiki/Lisp_(programming_language)"]Scheme bei Wikipedia[/url]

Der Link funktioniert nicht wegen zu vieler eckiger Klammern und url= wahrscheinlich einmal zu viel geklickt
Danke für eure Hilfe
viele Grüße
-- Manuela