Статические проверки типа условий - PullRequest
1 голос
/ 01 мая 2011

Ниже приведен код для проверки типа StaticCharme:

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

У меня уже есть проверка текста (expr, 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))

Ответы [ 2 ]

1 голос
/ 01 мая 2011

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


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

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
1 голос
/ 01 мая 2011

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

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

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

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

...