Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  LISP Hilfe

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:  LISP Hilfe (38 mal gelesen)
CADRufus
Mitglied
Technischer Zeichner


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

Beiträge: 18
Registriert: 31.08.2017

erstellt am: 31. Aug. 2017 12:41    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

Moin Moin liebes CAD-Forum,

ich habe mal angefangen mir ein bisschen LISP beizubringen. Dabei hangel ich mich durch die Anleitungen auf der Seite tutorial.autolisp.info scheint mir bisher die beste zu sein, die ich gefunden habe, auch wenn die Seite (glaube ich) nicht mehr super aktuell ist. Allerdings weiß ich auch nicht, wieviel sich bei LISP so mit der Zeit ändert.

Naja jetzt jedenfalls zu meinem Problem:

Die Übungsaufgabe die ich versuche zu lösen, lautet wie folgt
1. Schreiben Sie eine Test-Funktion, die feststellt, ob eine Zeichenkette Umlaute oder 'ß' enthält.

und meine bisherige (nicht funktionierende) Lösung ist folgende

(defun
str-check
(a / i c)
(setq i 1)
(while (and (= c nil) (<= i (strlen a)))
(setq c
(or
(= (substr a i 1) "ä")
(= (substr a i 1) "Ä")
(= (substr a i 1) "ö")
(= (substr a i 1) "Ö")
(= (substr a i 1) "ü")
(= (substr a i 1) "Ü")
(= (substr a i 1) "ß")
)
)
(princ "\n")
(princ i)
(princ "\n")
(princ c)
(setq i (1+ i))
)
(if
(/= c nil)
(princ "\nFehler: String darf keine Umlaute oder 'ß' enthalten.")
(princ "\nGreat success!")
)
)

Ist glaube ich nicht so besonders elegant, aber egal, erstmal muss das ja überhaupt funktionieren.

Über die Kommandozeile habe ich schon gecheckt, ob meine Teilfunktionen denn überhaupt funktionieren.

Habe dazu folgendes eingegeben:

(setq i 2)
(setq a "Täst")
(setq c (or (= (substr a i 1) "ä")(= (substr a i 1) "ö")))

Wenn ich dann !c eingebe bekomme ich wie erwartet T zurück.
Ich habe mir dann extra i und c für jeden schleifendurchlauf anzeigen lassen und c bleibt immer nil egal welchen String ich eingebe.

Hat da jemand eine Idee?

Schönen Gruß
Rufus

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

CADwiesel
Moderator
CAD4FM UG




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

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 31. Aug. 2017 13:56    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 CADRufus 10 Unities + Antwort hilfreich

Da c lokal definiert ist, wird nach verlassen der Funktion diese Variable auf nil gesetzt. Wenn du dir den Wert von c nach beendigung der Funktion ansehen möchtest, muss du sie bei der Deklaration entfernen.

Das ist erstmal die Antwort auf die Frage.

------------------
Gruß
CADwiesel
Besucht uns im CHAT

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

CADRufus
Mitglied
Technischer Zeichner


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

Beiträge: 18
Registriert: 31.08.2017

erstellt am: 31. Aug. 2017 14: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

Hi,

Danke für die Antwort.

Leider ist dies glaube ich nicht, dass das Problem ist, da ich c ja auch nur lokal verwende.
Meine manuelle Eingabe, die ich beschrieben habe, war nur um zu gucken, ob meine oder Abfrage funktioniert.

Ich habe c nur definiert damit ich meine while Schleife vorzeitig abbrechen kann, sobald ein Umlaut oder ein ß auftaucht.
Jedoch erhält c niemals einen Wert anders als nil, obwohl die Batterie an oder abfragen das eigentlich verursachen sollte, sobald ein Umlaut in dem geprüften String enthalten ist.

Ich hoffe ich konnte damit erklären, wo das Problem liegt.

Gruß,
Rufus

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

CADwiesel
Moderator
CAD4FM UG




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

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 31. Aug. 2017 14:19    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 CADRufus 10 Unities + Antwort hilfreich

Dein Programmaufruf ist so: (str-check "Täst")
wenn du dich nun im Vlide befinden würdest und deine Funktion debuggst, würde c nach dem 2. durchlauf den Wert T annehmen.
Da du dich aber nicht im Debugger befindest sondern das Lisp in Autocad lädst und ausführst, wird dir der Wert C immer mit nil zurückgegeben. Da du C durch Eingabe von !C in der Befehlszeile abfragen möchtest, kommen wir wieder zu meinem Beitrag im ersten Posting von mir. Also wenn du es so machen möchtest lass die lokale Deklaration weg
Abgesehen davon... wir haben ein extra Lisp Forum -> HIER

hier noch eine kleine Alternative zu deiner Funktion

Code:
(defun test (str / )
  (if
    (vl-some (function(lambda(x)(VL-STRING-SEARCH x str)))
          '("ü" "Ü" "ö" "Ö" "ä" "Ä" "ß")
          )
    (princ"\nUmlaut enthalten")
  )
  (princ)
  )

;;;Programmaufruf
(test "lkähdgflÖ<srgßp")


------------------
Gruß
CADwiesel
Besucht uns im CHAT

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

CADRufus
Mitglied
Technischer Zeichner


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

Beiträge: 18
Registriert: 31.08.2017

erstellt am: 31. Aug. 2017 14:43    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

Ups, tut mir Leid, hab das LISP-Forum wohl einfach übersehen.
Wenn du den threat als Mod verschieben kannst, wäre das ziemlich nett  
Nur um noch mal aufzuklären, ich will c gar nicht im Anschluss an den Funktionsaufruf mit !c abfragen.

Eine Frage hab ich aber noch, wenn ich darf:
Wieso bleibt c wenn ich die Funktion in ACAD aufrufe immer nil?

Rufus

Hab gerade deinen Code gesehen.
Da verstehe ich bisher leider nur Bahnhof. Die meisten Funktionen, die du verwendest wurden von dem Tutorial noch nicht behandelt.
Trotzdem Danke 

[Diese Nachricht wurde von CADRufus am 31. Aug. 2017 editiert.]

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

CADwiesel
Moderator
CAD4FM UG




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

Beiträge: 1968
Registriert: 05.09.2000

AutoCAD, Bricscad
Wir machen das Mögliche unmöglich

erstellt am: 31. Aug. 2017 15:26    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 CADRufus 10 Unities + Antwort hilfreich

c bleibt nicht immer nil aber wenn du nach Ende der Funktion die lokal definierte Variable abfragen willst, durch Eingabe von !C in der Befehlszeile, wird dir eben immer ein nil zurückgegeben weil sie ja lokal definiert ist und nicht global vorhanden ist - klaro?
Das Gleiche würde dir auch mit i passieren.

------------------
Gruß
CADwiesel
Besucht uns im CHAT

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