2012-03-29 3 views
0

В принципе, мне интересно, если существует язык, где этот код будет недействителен, потому что даже если counter и distance являются как int под капотом, они представляют собой несоответствующий тип в реальном мире:Язык с поддержкой приложений венгерской поддержки?

#include <stdio.h> 

typedef int counter; 
typedef int distance; 

int main() { 
    counter pies = 1; 
    distance lengthOfBiscuit = 4; 

    printf("total pies: %d\n", pies + lengthOfBiscuit); 

    return 0; 
} 

Это компилируется никаких предупреждений с «gcc -pedantic -Wall» и всех других языков, где я это пробовал. Похоже, было бы неплохо отказаться от случайного добавления счетчика и расстояния, так где же поддержка языка?

(Кстати, реальный пример, который вызвал этот вопрос, заключался в том, что веб-разработчик работал в PHP и Python - я пытался создать «скрытую HTML-строку», «SQL-экранированную строку» и «необработанный опасный пользовательский ввод» «несовместимо, но лучшее, что я могу представить, - это приложения, венгерские нотации, как это предлагается здесь, -> < - и это все еще зависит от проверки человека (« неправильный код выглядит неправильно »), а не поддержки компилятора (« неправильный код is wrong "))

+0

Как насчет ... любого статически типизированного языка, разрешающего пользовательские типы? Конечно, упаковка класса, например. целое число, просто чтобы добавить информацию «это расстояние», довольно определенно для определения и использования PITA. Но это, кажется, все. – delnan

+0

Это * может быть сделано полностью с пользовательскими и реализованными базовыми типами, проверенными во время выполнения; но, как вы говорите, это очень длинный способ сделать это. C typedef, как в примере, является довольно совершенным синтаксисом, я просто хочу, чтобы он не автоматически молчал между типами, но вместо этого выполнял ошибку времени компиляции ... – Shish

ответ

0

В Ada у вас могут быть типы, которые используют одно и то же представление, но все еще разные типы. Какой «сильный typedef» будет (если он существует) на C или C++.

В вашем случае, вы могли бы сделать

type counter is new Integer; 
type distance is new Integer; 

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

Derived types and sub types in Ada

+0

Благодарим за упоминание фразы сильного typedef, придерживающегося того, что в Google дано несколько других полезных обсуждений по этой теме (в основном люди спрашивают, можно ли это сделать на данном языке, а другие - нет, хотя никто не кажется принципиально противным идея...) – Shish

0

Вы можете создать объект, обертывающий неопределяющий тип в переменной-члене, и определить операции (даже в форме функций), которые имеют смысл в этом типе (например, LEngth определит« плюс », что позволит добавить к другая длина, но для угла).

Недостатком этого подхода является создание обертки для каждого базового типа, о котором вы заботитесь, и определения соответствующих операций для каждой разумной комбинации, которая может быть утомительной и, возможно, подверженной ошибкам.

В C++ вы можете проверить поддержку BOOST для dimensions. Приведенный пример разработан в основном для физических измерений, но я думаю, что вы могли бы адаптировать его и ко многим другим.

1

Haskell может сделать это, с GeneralizedNewtypeDeriving можно рассматривать завернутые значения в качестве основной вещи, в то время как только обнажая то, что вам нужно:

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
newtype Counter = Counter Int deriving Num 
newtype Distance = Distance Int deriving Num 

main :: IO() 
main = print $ Counter 1 + Distance 2 

Теперь вы получите ошибку:

Add.hs:6:28: 
    Couldn't match expected type ‘Counter’ with actual type ‘Distance’ 
    In the second argument of ‘(+)’, namely ‘Distance 2’ 
    In the second argument of ‘($)’, namely ‘Counter 1 + Distance 2’ 

Вы все еще можете «принудительно» использовать базовый тип данных с помощью «принуждения» или путем разворачивания ящиков явно.

Я должен добавить, что любой язык с «реальными» типами должен быть в состоянии сделать это.