Autor Thema: Scheme Funktionen selbst machen  (Gelesen 3504 mal)

infranator

  • Member
Scheme Funktionen selbst machen
« am: Dienstag, 21. Mai 2013, 19:26 »
Hallo Scheme Gurus,

ich habe mal in dem Extending Lilypond Handbuch herumgestöbert in der Hoffnung etwas mehr über die Eingeweide von Lilypond zu verstehen.
In Kapitel http://www.lilypond.org/doc/v2.17/Documentation/extending/music-properties steht folgendes Beispiel:
someNote = c'
#(set! (ly:music-property (first (ly:music-property someNote 'elements))
                          'pitch)
       (ly:make-pitch 0 1 0)) ;; Die Tonhöhen auf d' verändern.
\displayLilyMusic \someNote
Daraus habe ich im Schweiße meines Angesichts eine Funktion gebastelt, die sich auf einzelne Noten anwenden lässt:
changeToD =
#(define-music-function (parser location note-event)
   (ly:music?)
   (set! (ly:music-property note-event 'pitch)
      (ly:make-pitch 0 1 0))
   note-event)
\changeToD g'4
Jetzt meine Fragen:
1. Was muss man tun, damit die Funktion sich auf mehrere Noten anwenden lässt?
Also \changeToD { c4 d e f }
2. Bisher habe ich nur geschafft die Eigenschaften von 'pitch und 'duration von 'NoteEvent zu verändern.
Kann man auch ein 'NoteEvent zum 'RestEvent machen?
Über jede Hilfe bin ich dankbar!


Arnold

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #1 am: Mittwoch, 22. Mai 2013, 08:17 »
Hallo,

zuerst eine Antwort im Stil von Radio Eriwan: »Im Prinzip kann man alles, aber man muß erst verstehen was man durch was ersetzen muß.«

Die »Variablendefinition« erzeugen Datenstrukturen, welche man sich mit \displayMusic anzeigen lassen kann.
Diese Datenstrukturen muß man natürlich verstehen, um dort Änderungen vorzunehmen. Leider gelten die »Vereinbarungen, mit welchem Datenstrukturaufbau der musikalische Inhalt abgebildet wird« auch nicht auf immer und ewig - so waren früher alle Einzeltöne (NoteEvent) in einem Akkord (EventChord) eingeschlossen, heute stehen sie einzeln.

Zum Bearbeiten bieten sich zwei Methoden an:
a) Ein Musikschnipsel sequentiell, rekursiv durcharbeiten
b) mit \musicMap eine Scheme-Funktion auf alle ly:music?-Elemente (von unten nach oben) anwenden
Und immer daran Denken: Scheme benutzt viele Verweise; ändere ich ein Unterelement wirkt sich das auf allen Verwendungen dieses Unterelements aus; also gut planen, wo man (eventuell ganze Strukturbäume) kopiert und wo nicht.

Und, dieser Bereich ist nur der allererste, aber ein wichtiger Schritt bei der Erstellung des Notensatzes mit Lilypond.
Die Themengebiete Callback-Funktionen (z. Bsp. before-line-breaking, after-line-breaking) und dann Scheme-Engraver sind fortgeschrittene Themen.

Arnold

infranator

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #2 am: Dienstag, 28. Mai 2013, 19:35 »
Zitat
Die Themengebiete Callback-Funktionen (z. Bsp. before-line-breaking, after-line-breaking) und dann Scheme-Engraver sind fortgeschrittene Themen.
Mit Ersetzungsfunktionen bin ich erst mal ausgelastet  ;)
Mein Problem war, dass ich nicht wusste, dass man die 'elements Liste erst mit ly:music-property abrufen muss, bevor man sie rekursiv durcharbeiten kann.
Hier ist eine kleine Funktion, die Skips aus der Musik löscht:
removeSilence =
#(define-music-function (parser location music)
   (ly:music?)
   (let loop((elts (ly:music-property music 'elements)) (new-music '()))
     (if (null? elts)
         (make-music 'SequentialMusic 'elements (reverse new-music))
         (if (eq? (ly:music-property (car elts) 'name) 'SkipEvent)
             (loop (cdr elts) new-music)
             (loop (cdr elts) (cons (car elts) new-music))))))
\removeSilence { s1 a'4 s s b' c' d' s e' f' }

\musicMap habe ich noch nicht probiert, aber ich habe die \naturalizeMusic Funktion aus dem Handbuch
http://lilypond.org/doc/v2.16/Documentation/notation/changing-multiple-pitches#transpose
so umgebaut, dass sie alle Pitches zu b's macht. (sehr sinnvoll ich weiß ;))
Die Zeile mit map und lambda, macht doch das, was \musicMap machen würde, oder?

#(define (makeAllB music)
   (let ((elts (ly:music-property music 'elements))
         (elt (ly:music-property music 'element))
         (ptch (ly:music-property music 'pitch)))
     (if (pair? elts)
         (ly:music-set-property!
          music 'elements
          ; sich selbst auf jedes Element in 'elements Anwenden
          (map (lambda (x) (makeAllB x)) elts)))
     ; für Triolen:
     (if (ly:music? elt)
         ;; wenn in elt music ist,
         ;; sich selbst auf element-Unterlisten anwenden:
         (ly:music-set-property! music 'element
          (makeAllB elt)))
     ;; was überhaupt gemacht werden soll:
     (if (ly:pitch? ptch)
          (ly:music-set-property!
           music 'pitch
           (ly:make-pitch 0 6 0)))
     music))

allB =
#(define-music-function (parser location m)
   (ly:music?)
   (makeAllB m))



Das Scheme-Tutorial hier fand ich sehr hilfreich, besonders das "Looping" Kapitel!
http://www.shido.info/lisp/idx_scm_e.html

Ich arbeite gerade an einer Funktion, die benachbarte Skips mit gleicher Länge zu MultiMesureRests zusammenfasst.
Wenn ich da zu einem brauchbaren Ergebnis gekommen bin, poste ich das.
Bis jetzt bin ich aber einfach nur froh, dass ich mal was anderes außer Fehlermeldungen produziert habe!

harm6

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #3 am: Mittwoch, 29. Mai 2013, 13:56 »
Hallo infranator,

Zitat von: infranator
Hier ist eine kleine Funktion, die Skips aus der Musik löscht
Zitat von: infranator
Das Scheme-Tutorial hier fand ich sehr hilfreich, besonders das "Looping" Kapitel!
http://www.shido.info/lisp/idx_scm_e.html

Generell werden in scheme/guile loops u.ä eher mit Naserümpfen betrachtet.
Aus dem guile-manual v1.8.8:
Zitat
5.11.4 Iteration mechanisms
Scheme has only few iteration mechanisms, mainly because iteration in Scheme programs is normally expressed using recursion.

Du hast jetzt named let verwendet.

Das gefällt mir persönlich nicht so besonders. In Deinem  Fall kann man viel besser remove oder auch filter verwenden.
Der Code wird kürzer, eleganter und leichter verständlich.

Im Beispiel unten habe ich drei Wege codiert:
  • rekursiv
  • mit `remove'
  • mit `filter'

\version "2.16.2"
               
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% First:  Custom-recursion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (remove-skips-from-elts l1 l2)
"
 Filter all elements of l1 not matching 'SkipEvent.
 Append them to l2.
"
  (if (null? l1)
      (reverse l2)
      (remove-skips-from-elts
               (cdr l1)
               (if (not (eq? (ly:music-property (car l1) 'name) 'SkipEvent))
                   (cons (car l1) l2)
                   l2))))
               
removeSilenceI =
#(define-music-function (parser location music) (ly:music?)
  (let* ((elts (ly:music-property music 'elements))
         (new-music (remove-skips-from-elts elts '())))
  (make-music 'SequentialMusic
              'elements
              new-music)))
             
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Second:  Using `remove'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

removeSilenceII =
#(define-music-function (parser location music) (ly:music?)
  (let* ((elts (ly:music-property music 'elements))
         (new-music
           (remove
             (lambda (x) (eq? (ly:music-property x 'name) 'SkipEvent))
             elts)))
  (make-music 'SequentialMusic
              'elements
              new-music)))
             
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Third:  Using `filter'
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

removeSilenceIII =
#(define-music-function (parser location music) (ly:music?)
  (let* ((elts (ly:music-property music 'elements))
         (new-music
           (filter
             (lambda (x) (not (eq? (ly:music-property x 'name) 'SkipEvent)))
             elts)))
  (make-music 'SequentialMusic
              'elements
              new-music)))
     
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Example
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

m = { s1 a'4 s s b' c' d' s e' f' }
     
\m
\removeSilenceI \m
\removeSilenceII \m
\removeSilenceIII \m

In Deine zweite Funktion habe ich noch keinen Blick geworfen.


Weiterhin Gutes Gelingen.

Grüße,
  Harm
« Letzte Änderung: Mittwoch, 29. Mai 2013, 14:29 von harm6 »

harm6

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #4 am: Mittwoch, 29. Mai 2013, 22:34 »
Hallo,

nach meiner Erfahrung ist das Erlernen von scheme/guile nicht sooo problematisch. Allerdings habe ich mir diese Mühen auferlegt, um das erworbene Wissen und Können in LilyPond auch anwenden zu können. Und hier fangen die Probleme an größer zu werden:
Es gibt in LilyPond zalhlreiche mittels guile vordefinierte Proceduren/Funktionen, aber auch solche die zwar in C++ geschrieben, aber in guile anwendbar sind.
IR Kapitel 4. Scheme-functions
Das meiste davon ist kaum dokumentiert. :(

Da hat mir das Studium ihrer Anwendungen in den /ly bzw /scm Dateien geholfen, sowie das Stöbern in den Archiven bzw dem LSR.

Dies vorausgeschickt empfehle ich einen Blick in /scm/music-functions.scm
Dort gibt es einige Funktionen die Dir helfen könnten.

Ein Beispiel.
Anstatt in dem Beispiel aus meinem letzten post
     (eq? (ly:music-property x 'name) 'SkipEvent)abzufragen, kann man auch folgendes benutzen:
     (music-is-of-type? x 'skip-event)
Komplettes Beispiel:
\version "2.16.2"

removeSilenceIV =
#(define-music-function (parser location music) (ly:music?)
  (let* ((elts (ly:music-property music 'elements))
         (look-for-skips (lambda (x) (music-is-of-type? x 'skip-event)))
         (new-music (remove look-for-skips elts)))
  (make-music 'SequentialMusic 'elements new-music)))

m = { s1 a'4 r s r s b' c' r d' s r e' f' }

\new Staff \removeSilenceIV \m

Gruß,
  Harm

harm6

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #5 am: Donnerstag, 30. Mai 2013, 00:52 »
Hallo nochmal,

eigentlich sind Deine ursprünglichen Fragen noch unbeantwortet:

Zitat von: infranator
1. Was muss man tun, damit die Funktion sich auf mehrere Noten anwenden lässt?

Du könntest folgendermaßen vorgehen:

changeToD =
#(define-music-function (parser location music)(ly:music?)
   (let ((elts (ly:music-property music 'elements)))
   
   (if (null? elts)
     (set! (ly:music-property music 'pitch) (ly:make-pitch 0 1 0))
     (map
       (lambda (m)
         (set! (ly:music-property m 'pitch) (ly:make-pitch 0 1 0)))
       elts))
   music))
   
\changeToD g'4

\changeToD { c4 d e f }

Zitat von: infranator
2. Bisher habe ich nur geschafft die Eigenschaften von 'pitch und 'duration von 'NoteEvent zu verändern.
Kann man auch ein 'NoteEvent zum 'RestEvent machen?

Vielleicht so:

\version "2.16.2"

changeNoteToRest =
#(define-music-function (parser location music)(ly:music?)
   (let* ((elts (ly:music-property music 'elements))
          (new-elts
            (map
              (lambda (m)
                (if (music-is-of-type? m 'note-event)
                    (let* ((dur (ly:music-property m 'duration)))
                       (make-music
                         'RestEvent
                         'duration
                         dur))
                    m))
              elts)))
   (make-music 'SequentialMusic 'elements new-elts)))
   
mus = {
c'4 e' s8 r4 s16 r |
f'4 s g' r |
a' s16*4 b'4 r |
}
 
\changeNoteToRest \mus

Ich erklär jetzt mal nichts weiter, auch nicht wo noch Schwächen im Code sind die man zumindest absichern müßte. Da mußt Du erst mal selbst schauen.
Es handelt sich schließlich um Hausaufgaben. :D


Viele Grüße,
  Harm
« Letzte Änderung: Donnerstag, 30. Mai 2013, 12:17 von harm6 »

infranator

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #6 am: Montag, 3. Juni 2013, 00:18 »
Super, vielen Dank.
Aber ich hoffe ich muss die Hausaufgaben nicht morgen abgeben  ;)

Zitat
Generell werden in scheme/guile loops u.ä eher mit Naserümpfen betrachtet.
Heißt das, dass Rekursion generell vermieden wird? Ich hatte bisher den Eindruck, das es eine gängige Technik ist.
Oder gilt das nur für die Methode sich mit "car" und "cdr" durch eine Liste zu arbeiten?

In den Beispielen sind die filter und remove Methoden natürlich eleganter, aber sie scheinen mir weniger flexibel.
Wirklich beurteilen kann ich das natürlich noch nicht, da muss ich noch mehr rumprobieren.

harm6

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #7 am: Mittwoch, 5. Juni 2013, 00:55 »
Zitat
Heißt das, dass Rekursion generell vermieden wird?

Da haben wir uns komplett mißverstanden.

Rekursion ist die gängige Methode in scheme. Tatsächliche Schleifen sind eher verpönt, d.h. Konstrukte mit do bzw while.

Mich hat nur gestört, daß Du named let überhaupt verwendest, obwohl eine simple Rekursion doch leichter verständlich und nachvollziehbarer ist.

Zitat
In den Beispielen sind die filter und remove Methoden natürlich eleganter, aber sie scheinen mir weniger flexibel.

filter und remove sind spezielle, auf einen bestimmten Zweck zugeschnittene Proceduren.
Insoweit sind sie natürlich nicht flexibel. Sie tuen genau das wofür sie gedacht sind. Nicht mehr und nicht weniger.


Gruß,
  Harm

infranator

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #8 am: Mittwoch, 5. Juni 2013, 13:26 »
Zitat
Rekursion ist die gängige Methode in scheme. Tatsächliche Schleifen sind eher verpönt, d.h. Konstrukte mit do bzw while.
Da bin ich aber erleichtert, das bedeutet ich bin nicht bis jetzt komplett auf dem Holzweg gewesen. do zu vermeiden wird mir auch nicht schwer fallen, die Syntax kommt mir sehr umständlich vor.
named let habe ich nur verwendet weil ich irgendwie dachte es wäre elegant möglichst alles in eine einzige Funktion zu packen. Inzwischen habe ich aber gemerkt, dass man bei komplexeren Funktionen auf diese Weise sehr schnell die Übersicht verliert und Fehler immer schwerer zu erkennen sind.

Ich habe hier eine Funktion geschrieben, die "verschachtelte Musik" vereinfacht.
\version "2.16.0"

#(define (sequentialMusic? music)
   (eq? (ly:music-property music 'name) 'SequentialMusic))

#(define (sequential-music-in-elements? elts)
  (if (null? elts)
      #f
      (if (sequentialMusic? (car elts))
          #t
          (sequential-music-in-elements? (cdr elts)))))

#(define (one-level elts new-music)
   (if (null? elts)
       (if (sequential-music-in-elements? new-music)
           (one-level new-music '())
           (make-music 'SequentialMusic 'elements new-music))
       (if (sequentialMusic? (car elts))
           (one-level (cdr elts)
             (append new-music (ly:music-property (car elts) 'elements)))
           (one-level (cdr elts)
             (append new-music (list (car elts)))))))

oneLevel =
#(define-music-function (parser location music)
   (ly:music?)
   (one-level (ly:music-property music 'elements) '()))

\displayLilyMusic \oneLevel {
  c''2 b' |
  a' g' |
 
  { c'4 d' e' f' | }
  {
    { g' a' \times 2/3 { b'4 c'' d''} | }
    { e''2 f'' | }
  }
  { g''1 | }
}
->
{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  g' a' \times 2/3 { b' c'' d'' } |
  e''2 f'' |
  g''1 |
 
}

Ich will eine Funktion schreiben, die stille Pausen in \parallelMusic Blocks zu Mehrtaktpausen zusammenfasst.
Dazu muss erst mal die Liste auf auf ein 'SequentialMusic Element reduziert werden (Musik in Triolen e.t.c. ausgenommen) damit man benachbarte Elemente vergleichen kann.
siehe: https://liarchiv.joonet.de/index.php?topic=1272.msg7002#msg7002



harm6

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #9 am: Freitag, 7. Juni 2013, 02:30 »
Hallo,

ich habe mir Deine procedure one-level mal etwas genauer angesehen.

Wenn man
(write (display-lily-music (make-music 'SequentialMusic 'elements new-music) parser))als zweite Zeile hinzufügt, kann man die einzelnen Rekursionsschritte im Terminal verfolgen. Man erhält:

{  }
#<unspecified>{ c''2 }
#<unspecified>{ c''2 b' }
#<unspecified>{ c''2 b' |
  }
#<unspecified>{ c''2 b' |
  a' }
#<unspecified>{ c''2 b' |
  a' g' }
#<unspecified>{ c''2 b' |
  a' g' |
  }
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
 
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  { g' a' \times 2/3 { b' c'' d'' } |
    } { e''2 f'' |
    }
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  { g' a' \times 2/3 { b' c'' d'' } |
    } { e''2 f'' |
    } g''1 |
 
}
#<unspecified>{  }
#<unspecified>{ c''2 }
#<unspecified>{ c''2 b' }
#<unspecified>{ c''2 b' |
  }
#<unspecified>{ c''2 b' |
  a' }
#<unspecified>{ c''2 b' |
  a' g' }
#<unspecified>{ c''2 b' |
  a' g' |
  }
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d'
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e'
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f'
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
 
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  g' a' \times 2/3 { b' c'' d'' } |
 
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  g' a' \times 2/3 { b' c'' d'' } |
  e''2 f'' |
 
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  g' a' \times 2/3 { b' c'' d'' } |
  e''2 f'' |
  g''1
}
#<unspecified>{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  g' a' \times 2/3 { b' c'' d'' } |
  e''2 f'' |
  g''1 |
 
}
#<unspecified>
{
  c''2 b' |
  a' g' |
  c'4 d' e' f' |
  g' a' \times 2/3 { b' c'' d'' } |
  e''2 f'' |
  g''1 |
 
}

Wie man deutlich sieht läuft die Rekursion zweimal durch. Über elts und über new-music und verrichtet dabei zum Teil doppelte Arbeit.

Ich habe dann nach einer procedure gesucht, die nur dort in die Tiefe geht, wo verschachtelte Ausdrücke auch vorhanden sind und unnest-sequential-music geschrieben.
Die Definition für das schon erwähnte music-map war der Ausgangspunkt.
Dein sequentialMusic? habe ich übernommen.
Das Musikbeispiel habe ich etwas komplexer gestaltet.
flatten-list stammt aus /scm/lily-library.scm. Dort gibt es jede Menge nützliche Dinge zu entdecken.

\version "2.16.0"

#(define (sequentialMusic? music)
   (eq? (ly:music-property music 'name) 'SequentialMusic))

#(define (unnest-sequential-music music)
"
 Unnest sequential music.
 This procedure returns a list, which should be applied with:
 (make-music 'SequentialMusic 'elements (unnest-sequential-music music))
"
    (define (helper m lst)
      (let ((elts (ly:music-property m 'elements)))
        (if (pair? elts)
        (set! lst
              (map
                (lambda (y)
                    (append
                      lst
                      (if (sequentialMusic? y)
                          (helper y lst)
                          y)))
                elts)))
        (flatten-list lst)))
  (helper music '()))
   
unnestSequentialMusic =
#(define-music-function (parser location mus)
   (ly:music?)
  (make-music 'SequentialMusic 'elements (unnest-sequential-music mus)))
   
m = {
  c''2 b'-1\2---|^"xy" |
  a' g' |
 <d' f'>1
   { c'4 d' e' f' | }
 {
  {
    {
      g'4 a'
      \times 2/3 \unnestSequentialMusic { b'4 { c'' } d''} |
    }
    \repeat volta 2
    { e''2 f'' | }
    \alternative {
        { cis''1 }
        { ces''1}
    }
  }
 }
   { g''1 | }
}


\displayLilyMusic
\unnestSequentialMusic \m

Ausdrücke in \times, \repeat, \alternative etc werden nicht "geglättet" können aber einzeln angesprochen werden wie bei  \times ... im Musikbeispiel.
Das Ganze ist allerdings noch nicht sehr ausgiebig getestet, das mußt Du selbst machen ;)

Gruß,
  Harm
« Letzte Änderung: Freitag, 7. Juni 2013, 02:58 von harm6 »

infranator

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #10 am: Sonntag, 9. Juni 2013, 23:46 »
Wow, vielen Dank für die Arbeit!
Ich habe mir schon gedacht, dass es da elegantere Varianten gibt, bin aber auf keinen grünen Zweig mit meinen Versuchen gekommen.
Mir raucht immer noch der Kopf beim Versuch Deine Funktion zu verstehen, aber es wird langsam.  ;)

(write (display-lily-music (make-music 'SequentialMusic 'elements new-music) parser))
Wo genau muss ich das einbauen? Mit meinen Versuchen habe ich nur Fehlermeldungen erzeugt.

Zitat
/scm/lily-library.scm
Super Tipp!

Be-3

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #11 am: Sonntag, 9. Juni 2013, 23:53 »
Wo genau muss ich das einbauen? Mit meinen Versuchen habe ich nur Fehlermeldungen erzeugt.

Hallo infranator,

einbauen mußt Du die Zeile da, wo Harm geschrieben hat: als zweite Zeile [der Definition von one-level]

#(define (one-level elts new-music)
   (write (display-lily-music (make-music 'SequentialMusic 'elements new-music) parser))   
   (if (null? elts)
       (if (sequential-music-in-elements? new-music)
...


Viele Grüße
Torsten

harm6

  • Member
Re: Scheme Funktionen selbst machen
« Antwort #12 am: Montag, 10. Juni 2013, 00:08 »
Zitat
Ich habe mir schon gedacht, dass es da elegantere Varianten gibt, bin aber auf keinen grünen Zweig mit meinen Versuchen gekommen.
Mir raucht immer noch der Kopf beim Versuch Deine Funktion zu verstehen,

Ehrlich gesagt fand ich das auch nicht einfach und habe es keineswegs aus dem Ärmel geschüttelt.
Ich fühle mich wohler, wenn ich grob-properties manipuliere :)

Zitat
Mir raucht immer noch der Kopf beim Versuch Deine Funktion zu verstehen, aber es wird langsam.
Das wird schon.  ;D
Es ist viel schwieriger eine fremde Funktion/Definition zu verstehen als eine eigene zu bauen.
Ärgerlich wird es, wenn man eine vor längerer Zeit selbst gebaute, nach wie vor funktionierende Prozedur hat, aber zum Henker nicht mehr nachvollziehen kann, was man damals gemacht, warum, und warum und wie sie überhaupt arbeitet. ;)
Den Code ausführlich zu kommentieren ist da die beste Methode, auch wenn ich zugeben muß da durchaus selbst nachlässig zu sein.
Also tu was ich sage und nicht was ich tue.  ;D ;)

Zitat
Wo genau muss ich das einbauen?
Torsten war schneller. :)

Grüße,
  Harm