| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Erklärung zu einem Ausdruck gesucht (849 mal gelesen)
|
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 04. Dez. 2011 14:30 <-- editieren / zitieren --> Unities abgeben:
Habe etwas experimentiert und verstehe folgende Zeile nicht Code: ( '( (r) (* r 3) ) 5)
Es ergibt 15. Aber warum? Was bewirkt das Apostroph hier? Es sieht so aus, dass der Klammerausdruck nach dem Apostroph eine Funktion erzeugt. Gibt es dazu eine Regel oder Vorschrift, die das erklärt? Steht das wo? Da ich das auch thematisch nicht einordnen kann, habe ich auch keine bessere Überschrift zu diesem Thema gefunden, sorry. LG, Barbara
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 04. Dez. 2011 15:28 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
wronzky Ehrenmitglied V.I.P. h.c. CAD-Dienstleistungen für Architekten
Beiträge: 2154 Registriert: 02.05.2005 CAD: AutoCAD 2.6 bis 2014 ADT 2005 - 2014 Arcibem System: Windows 2000, XP, NO VISTA Internet-Startseite: http://www.archi.de
|
erstellt am: 04. Dez. 2011 20:57 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Hallo Barbara, was Du da vermutest, trift genau ins schwarze: (quote (...)) und (lambda ...) sind im Grunde das selbe. Also statt Code: ('((r) (* r 3)) 5)
geht natürlich auch:Code: ((quote ((r) (* r 3))) 5)
und damit auch:Code: ((lambda (r) (* r 3)) 5)
(Mapcar's Anmerkungen dazu).Grüsse, Henning ------------------ Henning Jesse VoxelManufaktur Computer-Dienstleistungen für Architekten und Ingenieure http://www.voxelman.de [Diese Nachricht wurde von wronzky am 04. Dez. 2011 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Barbara33 Mitglied
Beiträge: 91 Registriert: 18.04.2007 Windows 7, AutoCAD 2000 (englisch)
|
erstellt am: 05. Dez. 2011 13:33 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke, ich glaube, dass ich jetzt einiges mehr weiß. Also nach Hennings Ausführungen und Link verstehe ich, dass '(...) und (lambda ...) und (quote (...)) das selbe ergeben, wobei ... eine Argumentenliste und ein oder mehrere Ausdrücke sein muß, also mindestens zwei Ausdrücke, auch wenn sie leer sind. Denn dann hat man, schwupps, ganz unbürokratisch einfach aus der Form heraus eine Funktion definiert. Und das habe ich nirgends sonst gefunden. Meine Frage hat sich übrigens beim Lesen einer interessanten Programmbesprechung (Tic Tac Toe für AutoCAD) gestellt, wo ich eben bei einer Form wie oben hängen geblieben bin. Mag meine Frage für Udo vielleicht "sinnfrei" erscheinen, aber es ist eher eine Grundsatzfrage, wodurch der Bezug zum Praktischen etwas verloren geht. Dennoch danke für Deine Antwort. Ich habe sie aufmerksam gelesen. Zu den Links, die Du angegeben hast: Kannst Du mich bitte mit der Nase auf die Stellen stoßen, die im Zusammenhang mit meiner Frage relevant sind? An sich sind diese Seiten ja interessant. Dein Beispiel zum Ersatz für QUOTE wäre wohl so (quote x) = 'x richtig, oder? Sonst kommt eine Fehlermeldung. Und nebenbei: Konnte mir bisher auch nicht vorstellen, dass es eine Funktion mit zwei Apostroph-Zeichen hintereinander geben kann: (mapcar ''((a) (+ a 5)) '(2)) LG, Barbara Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 05. Dez. 2011 13:43 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
|
archtools Mitglied
Beiträge: 965 Registriert: 09.10.2004 Entwickler für AutoCAD, BricsCAD u.a., alle Systeme
|
erstellt am: 06. Dez. 2011 20:40 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Zitat: Original erstellt von wronzky: Hallo Barbara, was Du da vermutest, trift genau ins schwarze: (quote (...)) und (lambda ...) sind im Grunde das selbe.
Jein. Und man muss natürlich noch (defun-q ...) hinzunehmen, das ebenfalls dasselbe macht (und im alten Autolisp auch das (defun ...) selbst. Relevant ist, dass alle diese Funktionen gar nix machen mit ihren Parametern, sondern diese einfach so dastehen lassen, wie sie dastehen. Und deshalb liegt Udo Hübner falsch mit seiner Auskunft, dass (list ...) auch dazu gehört. List erzeugt eine Liste aus den Parametern, und die werden allesamt evaluiert. QUOTE, DEFUN-Q und LAMBDA (und das frühere, DEFUN des "echten Lisp") evaluieren nix. Jetzt muss man nur noch wissen, was Lisp-Funktionen überhaupt sind. Sie sind Listen. Eigentlich. Dass das in Visual-Lisp heute anders aussieht, liegt nur daran, dass die Funktionen durch DEFUN in einen Bytecode übersetzt werden, der intern aber immer noch so eine Liste ist. Der Haupteinsatzzweck von Lisp in der KI (künstliche Intelligenz) beruht gerade auf dem Umstand, dass Lisp-Funktionen aus Listen bestehen, die mit einer listenverarbeitenden Sprache wie Lisp jederzeit, also auch zur Laufzeit, verändert werden können. Ein Programm, dass sich zielgerichtet selbst verändert, kann man mit einiger Berechtigung als "selbstlernendes" Programm bezeichnen, kann ihm also ein gewisse Intelligenz zuordnen. DEFUN macht also auch nichts anderes als LAMBDA, außer, dass es den ganzen Krempel in einer Variablen speichert, die man dann als Funktionsname verwenden kann. Schreibt man so einen Variablennamen an den Anfang einer Liste, dann wird dieser Variablenname evaluiert. Dabei wird zuerst der Rest der Liste als Parameter den Symbolen im ersten Listenelement zugeordnet. Mit (defun rechne (r) (* r 3)) wird der Variablen rechne lediglich die Liste ((r) (* r 3)) zugewiesen. Mehr passiert dabei nicht (OK, es werden noch Funktionsnamen in Tabellen wie der, auf die Du mit (atoms-family ...) zugreifen kannst gespeichert). Ruft man nun (rechne 5) auf, dann wird rechne evaluiert. Der Parameter 5 wird dem Symbol r in der ersten Liste in rechne zugewiesen, und dann wird der Rest der Liste evaluiert. Das ist in diesem Fall nur (* r 3), und das ergibt den Rückgabewert 15. Du kannst das ja auch mal so ausprobieren: (setq rechne '((r) (* r 3))) Und dann probiere (rechne 6) aus :-) Da ich mir schon immer die Möglichkeit gewünscht hatte, in Auto- bzw VisualLisp Funktionen überladen zu können (d.h., sie mit verschieden vielen Parametern aufrufen zu können), hatte ich hier (http://ww3.cad.de/foren/ubb/Forum145/HTML/002950.shtml#000000) mal gezeigt, wie einfach das zu implementieren wäre. Leider aber hat Autodesk an einer Weiterentwicklung von Lisp absolut kein Interesse.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13527 Registriert: 30.11.2003 .
|
erstellt am: 07. Dez. 2011 10:25 <-- editieren / zitieren --> Unities abgeben: Nur für Barbara33
Zitat: Original erstellt von archtools: Jein. Und man muss natürlich noch (defun-q ...) hinzunehmen, das ebenfalls dasselbe macht (und im alten Autolisp auch das (defun ...) selbst. .... .... Da ich mir schon immer die Möglichkeit gewünscht hatte, in Auto- bzw VisualLisp Funktionen überladen zu können (d.h., sie mit verschieden vielen Parametern aufrufen zu können), hatte ich hier (http://ww3.cad.de/foren/ubb/Forum145/HTML/002950.shtml#000000) mal gezeigt, wie einfach das zu implementieren wäre. Leider aber hat Autodesk an einer Weiterentwicklung von Lisp absolut kein Interesse.
Sehr schöne Erklärung , Tom. Danke. Und zum letzten Absatz ein "Sign" und ein "Leider" ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|