Forum:Lisp
Thema:Element von Liste in Liste auf NIL pr��fen
Möchten Sie sich registrieren?
Wer darf antworten? Registrierte Benutzer können Beiträge verfassen.
Hinweise zur Registrierung Sie müssen registriert sein, um Beiträge oder Antworten auf Beiträge schreiben zu können.
Ihr Benutzername:
Ihr Kennwort:   Kennwort vergessen?
Anhang:    Datei(en) anhängen  <?>   Anhänge bearbeiten  <?>
Grafik für den Beitrag:                                                
                                                       
Ihre Antwort:

Fachbegriff
URL
Email
Fett
Kursiv
Durchgestr.
Liste
*
Bild
Zitat
Code

*HTML ist AUS
*UBB-Code ist AN
Smilies Legende
Netiquette

10 20 40

Optionen Smilies in diesem Beitrag deaktivieren.
Signatur anfügen: die Sie bei den Voreinstellungen angegeben haben.

Wenn Sie bereits registriert sind, aber Ihr Kennwort vergessen haben, klicken Sie bitte hier.

Bitte drücken Sie nicht mehrfach auf "Antwort speichern".

*Ist HTML- und/oder UBB-Code aktiviert, dann können Sie HTML und/oder UBB Code in Ihrem Beitrag verwenden.

T H E M A     A N S E H E N
Peter2

Beiträge: 3084 / 4

Win 7/64 Prof & Win 10/64 Pro
AutoCAD 2017 - 2019, Civil 3D 2017 - 2019,
BricsCAD V16 / V17 / V18
Revit 2018 / 2019

Ich habe eine Liste mit 4000 Elementen, die alle auch Listen mit je 15 Elementen sind. Jetzt hole ich mir laufend die Elemente aus den Listen, z.B.

Code:
5. Element der 438. Liste
12. Element der 932. Liste

mein Zugriff erfolgt so:

Code:
(setq mein_wert1 (rtos (nth 4 (nth 437 grossliste)) 2 0)
    mein_wert2 (strcase (nth 6 (nth 437 grossliste)))

Die Elemente der Unterlisten sind aber sehr bunt gemischt - REAL, STR und NIL:

Code:
(25.0 nil nil nil nil "Guten Tag " nil nil nil nil nil "0" nil nil)

Jetzt klappt mein Code (z.B. mit RTOS) natürlich nicht, wenn dieser Wert NIL oder STR ist. Jetzt graut mir ein wenig vor den Fehlerabfragen wie
Code:
if NIL then ...
if STR then ...

Gibt es da eine sparsame Lösung?

Schönen Abend

Peter

------------------
Für jedes Problem gibt es eine einfache Lösung.
Die ist aber meistens falsch. ;-)

cadffm

Beiträge: 18590 / 1005

System: F1
und Google

meine Frage wäre erstmal: Muß das so sein ???
Du mußt doch wissen (können) ob das 5.Element der50.Liste ein String ist oder nicht !?
falls das nicht so ist: Dann kommt die Prüfung vor der es dir graut - nur mache es nicht
mit 10 if-Abfragen sondern mit COND

andere Leute haben für sowas auch eine extra Sub in ihrer Bibo

------------------
die alte SUCHfunktion.. - System-Angaben - User:FAQ(Adesk)

wronzky

Beiträge: 2154 / 30

CAD:
AutoCAD 2.6 bis 2014
ADT 2005 - 2014
Arcibem
System:
Windows 2000, XP, NO VISTA
Internet-Startseite:
http://www.archi.de

...ausserdem kommt es darauf an, was Du danach machen willst.
brauchst Du immer einen String, dann nimm vl-princ-to-string.
oder Du fängst einfach die Fehler ab:
(if (vl-catch-all-error-p (setq val (vl-catch-all-apply 'rtos (list val)))) (setq val ""))

Grüsse, Henning

------------------
Henning Jesse
VoxelManufaktur
Computer-Dienstleistungen für Architekten und Ingenieure

  http://www.voxelman.de

Peter2

Beiträge: 3084 / 4

Win 7/64 Prof & Win 10/64 Pro
AutoCAD 2017 - 2019, Civil 3D 2017 - 2019,
BricsCAD V16 / V17 / V18
Revit 2018 / 2019

Zitat:
Original erstellt von cadffm:
...Du mußt doch wissen (können) ob das 5.Element der50.Liste ein String ist oder nicht !?...

Die Liste sind eingelesene Excel-Daten in unterschiedlichen Inhalten - und daher weiß ich es leider nicht.

Zitat:
Original erstellt von wronzky:
...brauchst Du immer einen String, dann nimm vl-princ-to-string....


Das ist ein interessanter Ansatz - werde ich prüfen.

Zitat:
Original erstellt von wronzky:
...(if (vl-catch-all-error-p (setq val (vl-catch-all-apply 'rtos (list val)))) (setq val ""))...

Das sagt mir derzeit noch nicht viel, aber ich werde es auch testen.

Danke und schönen Abend

Peter

------------------
Für jedes Problem gibt es eine einfache Lösung.
Die ist aber meistens falsch. ;-)

Dorfy

Beiträge: 892 / 251

AutoCad2007, ProE, HiCad

Hi,
mix die beiden Vorschläge
mit vl-catch-all-apply ne Sub aufrufen

Sub:
(cond
    ((= (type input) 'VLA-OBJECT) input)
    ((= (type input) 'ENAME)(vlax-ename->vla-object input))
     ;;............
    (T Nil)
  )

mfg heiko

Edit: oder Eingsngswert mit type auswerten und je nach Ausgabetype, mittels diversen kleinen subs, den Wert konvertieren

[Diese Nachricht wurde von Dorfy am 15. Mai. 2009 editiert.]

andi2050

Beiträge: 107 / 0

Wenn es nur die 4 Varianten gibt ('str 'real 'int 'nil) dann ist das doch nicht so schlimm.

(defun val2str (val / tp)
(setq tp (type val))
(cond ((= tp 'str) val)
      ((= tp 'real) (rtos val 2 3))
      ((= tp 'int) (itoa val))
      ((= tp 'nil) "")
      ('T (alert "Typ nicht definiert") "")
)
)

Grüße
Andi

Brischke

Beiträge: 4103 / 36

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

Hallo Peter,

aus meiner Sicht gibt es nun verschiedene Möglichkeiten an das Thema zu gehen:
1) Ein NIL wird ja bestimmt nicht aus Excel geliefert, deshalb sollte man an der Stelle des Auswertens der Excel-Daten vielleicht einen Leerstring anstelle des NIL's erzeugen.

2) Wenn du die NIL-Elemente nicht benötigst und die Position der anderen Elemente innerhalb dieser Liste keine Bedeutung haben, dann schmeiß einfach alle NIL's aus der Liste raus:
(vl-remove-if 'Not [LISTE])

3) Du bearbeitest die Liste in der Art wie das hier bereits formuliert wurde:
(defun VAL2STRING (val / valtyp)
(setq valtyp (type val))
(cond
((not val)"")
((= valtyp 'STR) val)
((= valtyp 'INT) (itoa val))
((= valtyp 'REAL) (rtos val))
((= valtyp 'LIST) (apply 'strcat (mapcar 'VAL2STRING val)))
(T "*ERROR*")
)
)

(Ich habe das nur hier im Editor runter getippt, Syntax noch prüfen!)

)
(setq LISTE (mapcar 'VAL2STRING LISTE))

Bei Fragen ...

Grüße!

Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.

Peter2

Beiträge: 3084 / 4

Win 7/64 Prof & Win 10/64 Pro
AutoCAD 2017 - 2019, Civil 3D 2017 - 2019,
BricsCAD V16 / V17 / V18
Revit 2018 / 2019

Dank an alle - die Sache scheint jetzt recht klar. Ich kann aber erst nächste Woche (oder nach dem Urlaub) das vertieft betrachten.

Zitat:
Original erstellt von Dorfy:
...Edit: oder Eingsngswert mit type auswerten und je nach Ausgabetype, mittels diversen kleinen subs, den Wert konvertieren...

Wie oben gesagt - gerade das hat mich nicht übermäßig verlockt ...

Zitat:
Original erstellt von Brischke:
...
1) Ein NIL wird ja bestimmt nicht aus Excel geliefert, deshalb sollte man an der Stelle des Auswertens der Excel-Daten vielleicht einen Leerstring anstelle des NIL's erzeugen.


Das ist sicher das Beste. Da dieser Codeteil aber ein komplexeres Internet-Fundstück ist habe ich gar nicht so recht hineingeschaut. Das sollte ich aber nachholen.

Zitat:
Original erstellt von Brischke:
...
2) Wenn du die NIL-Elemente nicht benötigst und die Position der anderen Elemente innerhalb dieser Liste keine Bedeutung haben, dann schmeiß einfach alle NIL's aus der Liste raus:
(vl-remove-if 'Not [LISTE])


Das geht nicht, weil die Position absolut wichtig ist.

Zitat:
Original erstellt von Brischke:
...
3) Du bearbeitest die Liste in der Art wie das hier bereits formuliert wurde:
(defun VAL2STRING (val / valtyp)
(setq valtyp (type val))
(cond
((not val)"")
((= valtyp 'STR) val)
((= valtyp 'INT) (itoa val))
((= valtyp 'REAL) (rtos val))
((= valtyp 'LIST) (apply 'strcat (mapcar 'VAL2STRING val)))
(T "*ERROR*")
)
)

(Ich habe das nur hier im Editor runter getippt, Syntax noch prüfen!)

)
(setq LISTE (mapcar 'VAL2STRING LISTE))...



Siehe oben - muss ich anschauen.

Noch ein schönes Wochenende an alle.

Peter

------------------
Für jedes Problem gibt es eine einfache Lösung.
Die ist aber meistens falsch. ;-)