Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Probleme mit Lambda ?

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Probleme mit Lambda ? (1318 mal gelesen)
andi2050
Mitglied



Sehen Sie sich das Profil von andi2050 an!   Senden Sie eine Private Message an andi2050  Schreiben Sie einen Gästebucheintrag für andi2050

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 30. Mrz. 2003 12:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi LISP-Experten !

Wenn ich die untenstehende Funktion mit 'Text im Editor prüfen' (LISP-Editor _VLIDE...)überprüfe, dann sind die Variablen (VTX_LIST NUM X ) als GLOBAL gekennzeichet. Diese habe ich aber deklariert !
Ich möchte aber keines Falls Globals erzeugen.

(defun seg2vtx_list (seg_list / num vtx_list )
  (setq num 0)
  (mapcar '(lambda (x)
    (setq num (1+ num))
    (setq
      vtx_list (append vtx_list (list (cons 10 (car x))) (list (cons 42 (caddr x))))
    )
  )
  seg_list
  )
 
)

Was ist da Falsch ?
Kann das an dem Lambda Audruck liegen ?

Ich bin mit meinem Latein am Ende.

Viel Dank im Vorraus

Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Moderator
CAD on demand GmbH




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 30. Mrz. 2003 20:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für andi2050 10 Unities + Antwort hilfreich

Hallo Andi,

so ganz weiß ich nicht, was die Funktion eigentlich machen soll. Das num ist vollkommen unnötig, wird ja auch im Lambda nicht benötigt. Wahrscheinlich hast du aber zum Posten hier einiges rausgelöscht.
So, nun zu Deinem Problem. Innerhalb eines Lambda- ausdruck's existiert ein eigener Namensbereich. Diesen kannst du genau wie beim Defun auch deklarieren.
(lambda (INPUTvar / LOKALvar)...)
Deine Variablen sind lokal deklariert, sollten also bei Beendigung wieder auf nil gesetzt werden. Das X bereits bei Beendigung der Lambda-Funktion. Zum überprüfen kannst du die Variablen mal mit in die Überwachung nehmen, das Programm durchlaufen lassen, am Ende sollten diese nil sein.
Mir ist auch schon passiert, dass ich Variablen erst einmal benutzt habe, und dann erst lokal deklariert habe - diese waren dann erst nach dem Neustart nur noch als Lokale Variablen vorhanden. Da jede defun, Lambda - Funktion ihren eigenen Variablenbereich hat, ist das auch logisch, dass nur die lokale Variable nil gesetzt wird und die globale Ihren Wert behält.

Sicher habe ich das hier jetzt nicht Lehrbuch getreu beschrieben, hoffe, dass es Dir dennoch weiter hilft.

Bei Fragen ...

Grüße Holger

------------------
Holger Brischke
CADlon - Lisp over night!
Neue Tool's im Free-&Download
Zugang zum Download schon gesichert?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

andi2050
Mitglied



Sehen Sie sich das Profil von andi2050 an!   Senden Sie eine Private Message an andi2050  Schreiben Sie einen Gästebucheintrag für andi2050

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 30. Mrz. 2003 22:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi Holger

Danke für Deine umfassende Antwort.

Du hast recht, die Funktion habe ich in gekürzter Version gepostet.
Im rausgelöschten Teil sind aber nur zahlreiche verknüpfte Abfragen, die nur verwirrt hätten. (Fehler tritt auch in gekürzter Form auf !)

NUM ist ein Zähler für die Anzahl der 'mapcar' Durchläufe, die brauche später in der Funktion.(Hätt' ich aber auch anders machen können fällt mir grade ein)

Ich hab's ausprobiert, die Variablen sind tatsächlich lokal.
Der Editor gibt mir aber bei allen Funktionen die LAMBDA enthalten globale Variablen beim prüfen aus.
Aus der Sicht der LAMBDA-Funktion sind die Variablen zwar schon global, trotzdem ist Ausgabe von 'Text im Editor prüfen' verwirrend.

Na ja wenn man weiß...

Grüße
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Moderator
CAD on demand GmbH




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 30. Mrz. 2003 22:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für andi2050 10 Unities + Antwort hilfreich

Hallo Andi,

genau vom Lambda aus betrachtet sind die in der (defun deklarierten Variablen global.

Wie oft ein mapcar ausgeführt wird - genauso oft wie die Liste lang ist. Ich denke diese Lösung ist Dir auch eingefallen. 
Ich weiß nun nicht mit welcher Listengröße Du es zu tun hast - möchte aber in diesem Zusammenhang auf mapcar's AutoLisp-Seiten verweisen. Diese sind z.Zt. aus Protest gegen den Krieg geschlossen, du kannst aber hier im Forum auch einige Beiträge zu Listen und der Verwendung vom (append ...) finden. Ich möchte nur darauf hinweisen, dass durch diese Konstrukte die Laufzeit von Programmen erheblich verlängert/verkürzt werden kann.

Bei Fragen...

Grüße Holger

------------------
Holger Brischke
CADlon - Lisp over night!
Neue Tool's im Free-&Download
Zugang zum Download schon gesichert?

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

andi2050
Mitglied



Sehen Sie sich das Profil von andi2050 an!   Senden Sie eine Private Message an andi2050  Schreiben Sie einen Gästebucheintrag für andi2050

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 30. Mrz. 2003 22:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi Holger

Mapcar's Seiten kenne ich, hab's mir auch schon mal runtergeladen aber noch nie richtig gelesen. Ich programmiere zwar schon seit mehereren Jahren in LISP, aber so richtig verstehen fange ich erst an.
Alte BASIC Zeiten lassen grüßen...

Über Laufzeitprobleme habe ich mir bisher noch nie Gedanken machen müssen.

Kann sein, daß in nächster Zeit noch einige Fragen auftauchen.

Grüße
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Moderator
CAD on demand GmbH




Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4171
Registriert: 17.05.2001

AutoCAD 20XX, defun-tools (d-tools.eu)

erstellt am: 30. Mrz. 2003 22:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für andi2050 10 Unities + Antwort hilfreich

Hallo Andi,

das mit dem 'erst jetzt verstehen' ist eine Sache die wohl jedem so geht. Ich selbst, schaue mir meine alten Code's auch nur mit sehr sehr, gemischten Gefühlen an. Ok - das Problem/Aufgabenstellung wurden gelöst, aber wie.....???!!!
Man lernt eben nie aus, und bei Fragen ... dazu gibt's ja das Internet. 

Grüße Holger

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 31. Mrz. 2003 09:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für andi2050 10 Unities + Antwort hilfreich

Hi Andi,

zwei Kleinigkeiten noch, um Holgers Ausführungen zu ergänzen. Ich kenne mich zwar mit dem Lisp-Editor kaum aus, da ich ihn nicht benutze, aber ich weiss, dass es hier angebracht ist, das QUOTE durch FUNCTION zu ersetzen, also:

(mapcar(function(lambda...

Und dann noch ein Tipp, der mit der Sache an sich nichts zu tun hat: Wenn man mit mapcar eine Liste bearbeitet, sollte man einen deskriptiven Namen für das Argument auswählen, z.B. so:

(mapcar
  (function
    (lambda(vertex / )
      ...
    )
  )
  vertices-liste
)

Das macht Code einfach lesbarer, nicht nur für andere, sondern auch für einen selbst. Standard-Variablennamen wie x legen allein durch die Namensgebung beim Leser eine Erwartung fest:

x ist ein zu ermittelnder numerischer Wert oder eine X-Koordinate
i,j sind Schleifenzähler
result ist das Ergebnis, meistens Rückgabe der Funktion usw.

Vertex ist der Singular, Vertices der Plural. Mich hat's verwirrt, dass eine Liste, die offensichtlich mehrere Vertices enthält, als 'Liste mit einem Vertex' bezeichnet ist. vtx_list wäre also der angebrachte Name für das, was entget zurückgibt.

Ich habe auch eine Weile gebraucht, um diese Dinge zu lernen. Aber seitdem kann ich ein altes Programm aufmachen und verstehe eigentlich immer sofort, was da abgeht. Langfristig spart man viel Zeit!

Gruss, Axel

------------------
Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

andi2050
Mitglied



Sehen Sie sich das Profil von andi2050 an!   Senden Sie eine Private Message an andi2050  Schreiben Sie einen Gästebucheintrag für andi2050

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 31. Mrz. 2003 15:54    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi Mapcar

Wenn ich QUOTE durch FUNCTION ersetze wird das X bei der Prüfung nicht mehr als Global ausgegeben. NUM und VTX_LIST werden nach wie vor als Globals ausgegeben.(Is mir aber wurscht, da ich jetzt weiß, daß es in Wirklichkeit keine sind !)

Was bewirkt eigentlich FUNCTION genau ?
In der Online Hilfe wird gesagt, daß der Compiler den LAMBDA-Ausdruck dann optimieren kann... Toll ! Aber was heißt das nun ???

Habe FUNCTION bisher ignoriert, da mir der Sinn unklar ist und das ' (QUOTE) kürzer zu schreiben ist.

Mit allgemainen LISP-Konventionen habe ich mich bisher nicht so genau auseinandergesetzt, habe mir aber meine eigenen zusammengereimt (zumindest teilweise) .
VTX_LIST ist bei mir eine Liste mit Vertices (wie bei LWPOLYLINE)
VTX ein einzelner Vertex.

@mapcar
Wie lange beschäftigst Du Dich schon mit LISP ?
Hast ja einiges an Hintergrundwissen angesammelt, das man nicht so von heute auf morgen kriegt ! RESPEKT !

Grüße
Andi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

mapcar
Mitglied
CADmin



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

Beiträge: 1250
Registriert: 20.05.2002

Time flies like an arrow, fruit flies like a banana (Groucho Marx)

erstellt am: 01. Apr. 2003 02:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für andi2050 10 Unities + Antwort hilfreich

Hallo Andi,

beschäftigen tue ich mich schon lange damit - da muss ich selber schmunzeln, wenn ich dran denke. War wohl 90/91, als ich mir meinen ersten PC angeschafft habe, ein XT mit 8 MHz!!! Und da war ein AutoCAD 2.6 drauf - das hat mich irgendwie interessiert. Ich habe ein bisschen damit rumgespielt, habe rausgekriegt, wie man in Lisp programmiert, und ein halbes Jahr später bin ich zu einem AutoCAD-Händler gegangen und hab mal vorgeführt, was ich da so gemacht habe. Kam gut an, und seitdem bin ich in dieser Branche tätig. Ich war sowieso grad auf der Suche nach einem neuen Betätigungsfeld, das vorige als selbständiger Kreissäger musste ich wegen Rückenschmerzen aufgeben:-(

Mittlerweile hat sich das Ganze aber etwas verschoben. AutoLisp ist zwar immer noch meine Nr.1 innerlich, aber die Internet-Sachen (HTML, Perl/CGI, Java usw.) nehmen eigentlich schon fast mehr Platz in meinem Alltag ein. Schade ist, dass AutoDesk sich *null* Mühe gibt, AutoLisp weiter zu entwickeln. Irgendwann sind die Tage gezählt - das tut mir weh - ein Dutzend Jahre gehen da über den Jordan. VBA ist da kein wirklicher Ersatz - VBA lebt davon, dass die Tasten Ctrl-C und Ctrl-V gut funktionieren und dass man genug Plattenplatz hat, um den ganzen redundanten, sich immer wiederholenden Code abzuspeichern.

Aber was genau bewirkt (function...) nun, um mal auf deine eigentliche Frage einzugehen. Bisher waren die Dinge einfach: (lambda) und (quote) - auch als ' geschrieben - waren in AutoLisp eigentlich immer das Selbe. Bis neulich (d.h. bis Einführung der VLIDE) war's egal, ob man (mapcar'(lambda(arg1 arg2 / )...  oder (mapcar''(arg1 arg2 / )... geschrieben hat. Jedes lambda konnte man durch einen Apostroph ersetzen - null Problemo. Das liegt daran, dass AutoLisp schon von Anfang an etwas einfacher gestrickt war als andere Lisp-Dialekte.

Der springende Punkt ist der: AutoLisp war bisher eine reine Interpretersprache, d.h. man hat Programme geschrieben, die erst zum Zeitpunkt der Ausführung ausgewertet wurden. Jede mit (list..) erzeugte Liste konnte auch ein Programm darstellen, wenn man wollte. Es gab keinen formalen Unterschied zwischen Programm und Daten. Man konnte z.B. Programme in AutoLisp schreiben, die andere Programme als Daten auffassten und analysierten usw. Aber durch die Einführung des Compilers (= Erzeugen von Bytecode in VLX-Dateien) sind all diese wunderbaren Möglichkeiten über die Wupper gegangen.

Der Unterschied zwischen QUOTE und FUNCTION ist der:

QUOTE = Lass diesen Ausdruck dahingestellt sein, wir werden später sehen, was wir daraus machen

FUNCTION = Das ist die endgültige Version, ich verzichte darauf, irgendwann noch etwas ändern zu wollen.

Auf die mit QUOTE verbuchten Sachen kannst du später im Programm noch einmal zugreifen. Bei den mit FUNCTION abgelegten Codezeilen ist das nicht mehr möglich!

Sieh den Unterschied einfach so: Du möchtest einen Taschenrechner für AutoCAD programmieren, die vier Grundrechenarten baust du gleich ein. Mit FUNCTION legst du fest, dass der Rechner auch nie mehr können wird - aber das sehr schnell. Bleibst du beim QUOTE, hältst du dir die Option offen, dass der Taschenrechner auch noch den Sinus lernst, ohne dass du das Programm noch mal ändern musst - aber vielleicht etwas langsamer in der Ausführungsgeschwindigkeit.

Grundsätzlich gilt einfach: Solange man Code schreibt, der auf eine konkrete Anwendung bezogen ist, gibt die VLIDE ihren Segen. Schreibt man aber allgemeinen Code, der flexibler reagieren kann, handelt man sich Compiler-Gemecker ein. Schade, dass das ganze Potenzial von Lisp verschenkt wird - aber damit müssen wir nun mal jetzt leben. Geschwindigkeit ist angesagt - nicht Intelligenz oder Flexibilität.

Gruss, Axel

------------------
Meine AutoLisp-Seiten
Meine private Homepage
Mein Angriff auf dein Zwerchfell
Mein Lexikon der Fotografie
Mein gereimtes Gesülze
Meine Überzeugung...

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

andi2050
Mitglied



Sehen Sie sich das Profil von andi2050 an!   Senden Sie eine Private Message an andi2050  Schreiben Sie einen Gästebucheintrag für andi2050

Beiträge: 107
Registriert: 11.03.2003

erstellt am: 01. Apr. 2003 15:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi mapcar

Glaub' jetzt hab ich's gerafft - Danke !
Ich hatte mal unter ACAD14 ein LISP das gleichzeitig POLYLINIEN und LWPLOLYLINIEN verarbeiten sollte. Dazu modifizierte ich während der Laufzeit den Code entsprechend. Nach dem Update auf A2002 funzte das plötzlich nicht mehr.
Ich konnte es mir damals nicht erklären und kickte einfach die alten POLYLINIEN raus. Jetzt kenn ich vermutlich den Grund...

Eigentlich sch...(ade), daß A'desk LISP vernachlässigt.
LISP ist bestimmt ein Grund, warum ACAD so verbreitet ist, da sich (fast)jeder das Programm so erweitern kann wie er will.
Hab auch schon mal in VB und VBA reingeschnuppert, ist mir aber (noch ?)zu 'umständlich' - viel Rauch um nichts.
Für einfachste Sachen - ewig langer Code (erinnert an Alte Z80-Assembler Zeiten - jedoch nicht vom Speicherplatz her !)

Na ja die werden schon wissen was sie tun !?!?

Ich habe schon vermutet, daß Du das ganze professionell betreibst.
Hast sozusagen das Hobby zum Beruf gemacht.
Bei mir isses mehr ein Hobby das ich beruflich nutze.

Grüße

Andi


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz