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:

Code: Alles auswählen

if Wert in Liste: print Wert,"ist in Liste enthalten"
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:

Code: Alles auswählen

if   exp == 't'     : return 't'      # true evaluates to itself
Hier wird der erste Listeneintrag überprüft:

Code: Alles auswählen

if   exp[0] == 'quote' : return exp[1]

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.

Code: Alles auswählen

l = []
print bool(l)
l = [None]
print bool(l)

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) :wink:

Gruß, mawe