2010-11-03 11 views
14

A question został opublikowany na temat operatorów porównywanych łańcuchów i sposobu ich interpretacji w różnych językach.Obsługa języków dla operatorów powiązanego porównania (x <y <z)

Operatory porównywania łańcuchów oznaczają, że (x < y < z) będzie interpretowany jako ((x < y) && (y < z)) zamiast jako ((x < y) < z).

Komentarze na temat tego pytania pokazują, że Python, Perl 6 i Mathematica obsługują operatory porównywania łańcuchów, ale jakie inne języki obsługują tę funkcję i dlaczego nie jest ona bardziej powszechna?

Szybkie spojrzenie na dokumentację Pythona pokazuje, że funkcja ta istnieje od co najmniej 1996 roku. Czy istnieje powód, dla którego więcej języków nie dodało tej składni?

Statycznie napisany język może mieć problemy z konwersją typu, ale czy istnieją inne powody, które nie są bardziej powszechne?

+1

Dobre pytanie. Wydaje mi się, że byłby on kompatybilny wstecz przynajmniej z Javą. (Ponieważ '<' and '>' nie są zdefiniowane dla booleans.) – aioobe

+1

Myślę, że to nie jest powszechne, ponieważ programiści są zbytnio przyzwyczajeni do '<' bycia operatorem binarnym. – CodesInChaos

+0

Dlaczego języki napisane statycznie mają z tym problemy? Jakie konwersje masz na myśli? – sepp2k

Odpowiedz

9

To powinno być bardziej powszechne, ale podejrzewam, że nie jest, ponieważ sprawia, że ​​języki parsowania są bardziej złożone.

Korzyści:

  • podtrzymuje zasadę najmniej zaskoczyć
  • czyta się jak matematyka jest nauczana
  • Zmniejsza obciążenie poznawcze (patrz poprzedni 2 punkty)

wady:

  • Gramatyka jest bardziej skomplikowana dla język
  • Przypadek specjalny cukier syntaktyczny

Na pytanie dlaczego nie, moje domysły są:

  • autora (ów) Język nie myśleć o tym
  • jest na „miłe mieć”lista
  • zdecydowano, że nie było na tyle użyteczny, aby uzasadnić wdrożenie
11

Korzyści są zbyt małe, aby uzasadnić komplikowanie języka.

Nie potrzebujesz tego tak często i łatwo jest uzyskać ten sam efekt z kilkoma znakami.

+1

Dodatkowa złożoność wydaje się być kiepskim powodem. Nie mogę wymyślić przyczyny, dla której obecna funkcjonalność byłaby przydatna w dynamicznie pisanym języku, a to dodawałoby dodatkowej funkcjonalności bez większych konfliktów. Wydaje mi się również, że jest to łatwiejsze do odczytania. –

+0

Zwykle się zgadzam. Jest zgrabny jeden milion razy, ale z pewnością wymaga wiele wysiłku, aby zaimplementować go w grammerze i włączyć go do niego. – delnan

+0

@Alan Nie możesz myśleć o tym w ten sposób. Zamiast tego musisz go odwrócić, co zyskujesz, w porównaniu do pracy wymaganej do specyfikacji, udokumentowania, zaplanowania, wdrożenia i przetestowania? –

1

Myślę, że ICON jest językiem oryginalnym, który to posiada, aw ICON-u wychodzi z drogi, że booleany są traktowane jako specjalne znaczniki "fail", a wszystkie inne wartości są traktowane jako prawdziwe.

3

Scheme (i prawdopodobnie większość innych języków Lisp rodziny) obsługuje wielokrotne porównania efektywnie w jego gramatyki:

(< x y z) 

Można to uznać za zwykłą aplikację funkcji o < z trzema argumentami. Zobacz 6.2.5 Numerical Operations w specyfikacji.

Clojure obsługuje także chained comparison.

+0

Czy działa z n argumentami? – starblue

+0

@starblue: Tak, tyle argumentów, ile chcesz. –

1

Chained współpracy mparison jest cechą BCPL od późnych lat sześćdziesiątych.

Powiązane problemy