2011-05-01 3 views
1

Ниже код для проверки типов StaticCharme:Статические проверки типа условными

Мне нужна помощь в определении метода typeConditional (выражение, ENV). Необходимо проверить, что все предикатные выражения оцениваются по логическому значению. Чтобы условное выражение было корректным, последующие выражения каждого предложения производят значения одного и того же типа. Тип условного выражения является типом всех последующих выражений.

У меня уже есть typcheck (выражение, ENV) метод:

def typecheck(expr, env): 
if isPrimitive(expr): 
    return typePrimitive(expr) 
elif isConditional(expr): 
    return typeConditional(expr, env) 
elif isLambda(expr): 
    return typeLambda(expr, env) 
elif isDefinition(expr): 
    typeDefinition(expr, env) 
elif isName(expr): 
    return typeName(expr, env) 
elif isApplication(expr): 
    return typeApplication(expr, env) 
else: evalError ("Unknown expression: " + str(expr)) 
+1

Ваш наиболее насущной необходимостью является использование больше места в вашем отступы –

+0

возможного дубликата [Определение процедуры типаConditional] (http://stackoverflow.com/questions/5791049/defining-a-typeconditional-procedure) –

ответ

1

Для случая, как это обычно я пытаюсь начать с простых выражений, а затем построить до более сложных из них:

def typeConditional(expr, env): 
    # handle a literal 
    # handle a variable 

потом думать о том, как сломать более сложные случаи, в состав более простых случаев ...

Кроме того, когда вы пишете тесты, вы можете заказать их от простых до сложных, чтобы вы могли просто работать через них по очереди.

1

Пожалуйста, будьте предельно конкретны в отношении того, какие входные данные получат ваши функции, и какие выходы они должны генерировать. Это очень важно! Поскольку вы не были конкретны, любой, кто пытается помочь вам, должен угадать, что вы хотите сделать.


Из вашего заявления:

In order for a conditional expression to be type correct: 
    a) All predicates must be boolean 
    b) All consequents must have the same type 
If it typechecks: 
    The type of the conditional expression 
    is the type of the consequent expressions. 

Это переводит почти непосредственно (псевдо) кода:

def typeConditional(condition, env): 
    #receives a conditional expression, and an execution environment 
    # returns the expression's type if it is well typed 
    # or None otherwise 

    predicates = get_predicate_expressions(condition) 
    if any predicate has a type that is not Bool: 
     return None 
    else: 
     consequents = consequent_expressions(consition) 
     the_type = typcheck(first consequent, env)  
     if all consequents have type the_type: 
      return the_type 
     else: 
      return None 
Смежные вопросы