Mein Pack&Go-System... das erste Mal, dass ich einfach Nein sagen muss. Und zwar deshalb, weil mein System gleichzeitig die Dateien verschlüsselt. Sie sind dann zwar noch ausführbar, aber nur mit dem zehnfachen Aufwand der Neuprogrammierung lesbar.
Ich hoffe, die Ironie mit dem 'Fünfzeiler' war erkennbar - es ist seit der Einführung von VisualLisp als Compilersprache recht komplex geworden, da man ja keinen Zugriff mehr auf seine eigenen Funktionen hat, es sei denn, man arbeitet ausschliesslich mit defun-q, das ja schliesslich das bisher verwendete defun ist.
Es ist mühsam, Quellcodedatein nach irgendetwas wie z.B. der Verwendung von Bibliotheksfunktionen zu durchsuchen. Daher mein Tipp für eine Vorgehensweise:
1 Man schreibe sich ein defun-x, was (anhand eines globalen Schalters oder so) entweder defun (für den Arbeitsbetrieb) oder defun-x (für das Zusammenstellen eines Pack&go-Pakets) wird. defun-x wird in Programmen, aber nicht in den Bibliotheken verwendet.
2 Das Programm nach Bibliotheksfunktionen durchsuchen. Ein Beispiel:
Kurzes Programm:
(defun-q c:mach-was( / antwort)
(if(richtige-antwort(setq antwort(frag-was)))
(zeichne-was(berechne-was antwort))
(huste-ihm-was)
)
(princ)
)
Alle Funktionen (ausser defun-q und setq) sind hier Bibliotheksfunktionen.
Mit (flatten defun-q-list-ref 'c:mach-was) kriegen wir so eine Art lokale Atomliste. defun-q-list-ref ist übrigens eine dummy-Funktion, sie macht absolut nix, sie gibt nur die Bindung des Symbols wieder:
(defun-q-list-ref 'c:mach-was) <=> c:mach-was
(flatten c:mach-was) oder
(flatten(defun-q-list-ref'c:mach-was))
=>(richtige-antwort frag-was setq zeichne-was berechne-was huste-ihm-was princ)
3 Duplikate aus dieser Liste entfernen (mit vl-sort und while)
4 Diese Liste kann man nun mit einer Liste aller bisher verfügbaren Bibliotheksfunktionen vergleichen - defun-q, setq, princ fliegen raus:
=>(richtige-antwort frag-was zeichne-was berechne-was huste-ihm-was)
5 Das, was übrigbleibt, muss reinkopiert werden, nicht aus der Quelldatei, sondern aus dem Arbeitsspeicher. Geht mit defun-q-list-ref.
Und so geht flatten:
; Macht aus jeder Liste eine lineare Liste, was auch für mit defun-q definierte Funktionen gilt:
(defun flatten(l / )
(cond
((null l)nil)
((atom l)(list l))
('T(append(flatten(car l))(flatten(cdr l))))
)
)
[Noch ein Tipp für die Hartgesottenen: Append in der Rekursion ist nicht langsamer als cond!]
Soweit also ein Lösungsansatz, wie man so ein Pack&Go realisieren kann.
Gruss, Axel
------------------
Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...
[Diese Nachricht wurde von mapcar am 15. April 2003 editiert.]
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP