Seite 1 von 1
If-Statement mit Lste in der Bedingung ?
Verfasst: Sonntag 21. November 2004, 15:20
von alex0801
Servus,
habe die Aufgabe einen Lisp-Interpreter der in Python geschrieben ist in java zu übersetzen.
Doch irgendwie hab ich da n par verständnisprobleme.
Beispielsweise diese methode hier:
Code: Alles auswählen
def eval (exp, alist) :
"evaluate an S expression using the alist"
global Alist
if debug : print "--Eval---", sxp(exp), " alist=",sxp(alist)
if exp == 't' : return 't' # true evaluates to itself
elif exp == 'nil' : return [] # symbol nil same as a null list
elif exp == 'alist' : return Alist # special command to examine alist
elif isNumber(exp) : return exp # numbers eval to themselves
elif isSymbol(exp) : return assoc(exp,alist) # look up variables
else : # check for special forms
if exp[0] == 'quote' : return exp[1]
elif exp[0] == 'def' : # special extra. Let user define functions that stick
alist = Alist = pairlis([exp[1]],[exp[2]],alist)
return exp[1] # return function name
elif exp[0] == 'cond' : return evcon(exp[1:], alist)
else :
x = evlis(exp[1:], alist)
return apply (exp[0],x , alist)
exp ist eine Liste. Doch wie kann ich eine IF-Abfrage auf die GANZE Liste anwenden ?
In Java habe ich diese Liste als String-Array realisiert. Doch um dann diese Liste in eine IF-Bedingung zu packen muss ich noch dazu sagen welchen Index ich aus diesem Array haben möchte.
Beispielsweise die "if exp == 'nil' " Zeile...
Kann mich da mal jmd einweisen ? Hab in der Doku nix gefunden und wüsste auch grad nicht wo ich da anfangen soll zu suchen...
Für jede Hilfe wär ich dankbar.
gruß
Alex
Verfasst: Sonntag 21. November 2004, 15:56
von alex0801
Nur damit mich hier keiner falsch versteht... ich will keine fertige Programmlösung.
Ich wäre dankbar wenn mir jemand erklären würde wie Python eine Liste in der bedingug einer IF-Abfrage behandelt...
Welches Element in der Liste wird denn der Abfrage unterzogen ?
Oder werden alle elemente aus der Liste dieser Abfrage unterzogen ?
Google, Pythontutorials, quick references haben mich nicht weiter gebracht und mit der Suche im Forum hatte ich auch kein erfolg.
Danke
- Alex
Re: If-Statement mit Lste in der Bedingung ?
Verfasst: Sonntag 21. November 2004, 15:56
von jens
alex0801 hat geschrieben: Doch wie kann ich eine IF-Abfrage auf die GANZE Liste anwenden ?
Ich verstehe die Problematik nicht so ganz... Was soll den Bsp. per IF Abgefragt werden?
Es gibt sowas wie:
Also Prüfen ob ein bestimmter Wert in einer Liste vorkommt... Ist es das was du willst?
Verfasst: Sonntag 21. November 2004, 16:03
von Gast
Ja, prüfen ob ein bestimmter Wert in einer Liste ist.
So hab ich mir das auch gedacht. Vielleicht fehlt ja einfach nur der restliche Code um das Problem zu klären.
Guckt ihr hier:
Code: Alles auswählen
#!/usr/local/bin/python
#
# L i s p . p y
#
# Copyright 2001 by Chris Meyers.
#
import sys, lispio
debug = 0 # show trace of evaluations if true
sxp = lispio.putSexp # our function to convert python list to Sexp
Alist = [] # Hold the global defs
def isSymbol(x) : return type(x) == type('')
def isNumber(x) : return type(x) == type(0.0)
def pairlis (x,y,alist) :
"""push symbols in x along with respective values in y onto the alist"""
if not x : return alist
else : return [[x[0],y[0]]] + pairlis(x[1:],y[1:],alist)
def assoc (x, alist) :
"look up x on the alist and return its value"
if not alist : raise "Lisp error"
elif alist[0][0] == x : return alist[0][1]
else : return assoc(x,alist[1:])
def apply (fn,args,alist) :
"apply a function fn to its arguments in args"
if debug : print "--Apply--", sxp(fn), " Args=",sxp(args), " alist=",sxp(alist)
if isSymbol(fn) : # name of a function
if fn == 'atom' : return [[],'t'][type(args[0]) != type([])]
elif fn == 'car' : return args[0][0] # first element of 1st arg
elif fn == 'cdr' : return args[0][1:] # tail of 1st arg
elif fn == '+' : return args[0]+args[1]
elif fn == '*' : return args[0]*args[1]
elif fn == 'eq' : return [[],'t'][args[0] == args[1]]
elif fn == 'not' : return [[],'t'][args[0] == []]
elif fn == 'cons' :
if type(args[1]) != type([]) : args[1] = [args[1]]
return [args[0]] + args[1]
else : return (apply(eval(fn,alist),args,alist))
elif fn[0] == 'lambda' : # a function definition
return eval (fn[2], pairlis(fn[1],args,alist))
else : raise "Lisp error"
def eval (exp, alist) :
"evaluate an S expression using the alist"
global Alist
if debug : print "--Eval---", sxp(exp), " alist=",sxp(alist)
if exp == 't' : return 't' # true evaluates to itself
elif exp == 'nil' : return [] # symbol nil same as a null list
elif exp == 'alist' : return Alist # special command to examine alist
elif isNumber(exp) : return exp # numbers eval to themselves
elif isSymbol(exp) : return assoc(exp,alist) # look up variables
else : # check for special forms
if exp[0] == 'quote' : return exp[1]
elif exp[0] == 'def' : # special extra. Let user define functions that stick
alist = Alist = pairlis([exp[1]],[exp[2]],alist)
return exp[1] # return function name
elif exp[0] == 'cond' : return evcon(exp[1:], alist)
else :
x = evlis(exp[1:], alist)
return apply (exp[0],x , alist)
def evcon (c, alist) :
"evaluate cond. Note just the pairs passed in c"
if len(c) == 0 : return []
elif eval (c[0][0], alist) : return eval (c[0][1],alist)
else : return evcon(c[1:], alist)
def evlis (l, alist) :
"evaluate all elements in a list, returning list of the values"
if not l : return []
else : return [eval(l[0], alist)] + evlis(l[1:], alist)
def main () :
"get S expressions and evaluate them. Print the results"
global Alist
while 1 :
try : s = lispio.getSexp()
except : break
try : print lispio.putSexp(eval(s ,Alist))
except : print '???'
if __name__ == "__main__" : main()
In der "Methode" eval wird geprüft was in der Liste enthalten ist und dann wird was entsprechendes ausgeführt.
Doch so wie's da geschrieben steht weiß ich ja nicht welches Element der Liste dieser Prüfung unterzogen wird.... Und genau das ist das Problem an der Sache...
- Alex
Re: If-Statement mit Lste in der Bedingung ?
Verfasst: Sonntag 21. November 2004, 16:07
von jens
Naja, dein Listing erfordert etwas einarbeitungszeit.... Nur soviel, es scheint so, das
exp manchmal ein normaler String ist und manchmal eine Liste.
Also hier ist exp offensichtlich keine Liste:
Hier wird der erste Listeneintrag überprüft:
Verfasst: Sonntag 21. November 2004, 16:13
von alex0801
ach scheiße,
stimmt, in Python kann man Variablentypen ja zur Laufzeit ändern... stimmt, das erklärt natürlich einiges.
Könnt mich grad tod-ärgern... Das hat mich jetzt Stunden aufgehalten.
Gut, dann denke ich ist mein Problem für's erste gelöst.
Zum Listing selbst: jepp, also Java-Only-Kenner dauert das ne halbe ewigkeit. Zumal Lisp nicht so einfach zu programmieren ist.
- Alex
Verfasst: Sonntag 21. November 2004, 16:16
von Dookie
Hi,
eine if-Abfrage auf eine ganze Liste liefert wenn die Liste leer ist False und sonst True, unabhängig was für Elemente in der Liste sind. Kann man auch leicht anhand von bool zeigen.
Gruß
Dookie
Verfasst: Sonntag 21. November 2004, 16:43
von fs111
Prüfen ob ein Wert in einer Liste ist, geht auch mit "in"
Code: Alles auswählen
>>> l = [1,2,3,4]
>>> if 1 in l:
... print "ist drin"
...
ist drin
Den index bekommst Du dann mit der index()-Funktion der Liste
fs111
Verfasst: Sonntag 21. November 2004, 17:27
von Gast
Alles klar, danke euch,
mein denkfahler war wirklich "nicht dran gedacht zu haben" daß Python Variablentypänderungen während der Laufzeit zulässt... Habs jetzt gelöst.
- Alex
Verfasst: Sonntag 21. November 2004, 18:37
von mawe
Hi!
Naja, jetzt hast Du's ja gelöst, aber es hätte geholfen wenn Du
debug auf 1 gesetzt hättest (dann wird schön angezeigt, was in exp steht)
Gruß, mawe