2009-07-26 9 views
7

W tej chwili szukam języka programowania, w którym można napisać lekcję matematyki. Wiem, że jest ich wszędzie dużo, ale ponieważ mam zamiar rozpocząć naukę matematyki w następnym semestrze, pomyślałem, że to może być dobre sposób, aby uzyskać głębszy wgląd w to, czego się nauczyłem.Czy istnieje mocno napisany język programowania, który umożliwia definiowanie nowych operatorów?

Dziękuję za odpowiedzi.

BTW: Jeśli zastanawiasz się, co chciałem zapytać: „Czy istnieje silnie wpisany język programowania, który pozwala na definiowanie nowych operatorów”

+0

Określanie "użytkownik". – Svante

+2

"Operator" to dość dobrze zdefiniowany termin. –

Odpowiedz

19

Like EFraim said, Haskell czyni to całkiem proste:

 
% ghci 
ghci> let a *-* b = (a*a) - (b*b) 
ghci> :type (*-*) 
(*-*) :: (Num a) => a -> a -> a 
ghci> 4 *-* 3 
7 
ghci> 1.2 *-* 0.9 
0.6299999999999999 
ghci> (*-*) 5 3 
16 
ghci> :{ 
   let gcd a b | a > b  = gcd (a - b) b 
      | b > a  = gcd a (b - a) 
      | otherwise = a 
  :} 
ghci> :type gcd 
gcd :: (Ord a, Num a) => a -> a -> a 
ghci> gcd 3 6 
3 
ghci> gcd 12 11 
1 
ghci> 18 `gcd` 12 
6 

Można zdefiniować nowych operatorów Infix (tylko symbole) stosując składnię Infix. Następnie możesz użyć ich jako operatorów infiksów lub zawrzeć je w parens, aby używać ich jako normalnej funkcji.

Można również użyć normalnych funkcji (litery, cyfry, podkreślenia i pojedyncze cudzysłowy) jako operatorów , zamykając je w klawiszach tylnych.

+0

czy pozwala ci majstrować z pierwszeństwem? – skaffman

+2

Yup! Użyj "infixr" i "infixl": http://www.zvon.org/other/haskell/Outputsyntax/fixityQdeclaration_reference.html – rampion

9

Może Haskell? Umożliwia zdefiniowanie dowolnych operatorów infiksów.

10

Cóż, możesz przedefiniować stały zestaw operatorów w wielu językach, takich jak C++ lub C#. Inne, takie jak F# lub Scala, umożliwiają definiowanie nawet nowych operatorów (nawet tych infiksowych), które mogą być jeszcze lepsze dla elementów matematycznych.

8

Ted Neward napisał serię artykule o Scala głównie dla programistów Java, i skończył ją, pokazując jak pisać matematycznego języka domeny w Scala (który, nawiasem mówiąc, jest statycznie wpisany język)

Part 1

Part 2

Part 3

+1

Myślę, że wadą Scala byłaby niezdolność do przedefiniowania pierwszeństwa i asocjatywności. Są one stałe (zdefiniowane przez pierwszy i ostatni znak nazwy metody). –

+0

Tak, to trochę pachnie. – skaffman

3

W C++ można określić operatorów, które działają na innych klas, ale nie sądzę, inne typy pierwotne jak ints, ponieważ nie mogą mieć metod instancji. Możesz stworzyć własną klasę liczbową w C++ i przedefiniować WSZYSTKIE operatorów, w tym + * itd.

Aby wprowadzić nowych operatorów na typy pierwotne, musisz przejść do programowania funkcjonalnego (jak wynika z innych odpowiedzi). To jest w porządku, należy pamiętać, że funkcjonalne programowanie bardzo różni się od OOP. Ale będzie to nowe wielkie wyzwanie, a funkcjonalne programowanie świetnie nadaje się do matematyki, ponieważ pochodzi z lambda. Nauka programowania funkcjonalnego nauczy Cię różnych umiejętności i znacznie ułatwi ci matematykę i programowanie. : D

powodzenia!

2

Ada posiada wsparcie dla operatorów nadrzędne Infix: oto reference manual chapter.

Niestety nie można tworzyć własnych nowych operatorów, wydaje się, że można tylko zastąpić istniejące.

type wobble is new integer range 23..89; 

function "+" (A, B: wobble) return wobble is 
begin 
    ... 
end "+"; 

Ada nie jest ogromnie popularny język, to musi być powiedziane, ale w miarę silny wpisywanie idzie, nie można dostać o wiele silniejszy.

EDIT:

innym języku, który nie został jeszcze wspomnieć jest D. Jest to również język mocno napisany i obsługuje operator overloading. Ponownie, nie obsługuje on zdefiniowanych przez użytkownika operatorów infiksów.

Od http://www.digitalmars.com/d/1.0/rationale.html

Dlaczego nie pozwolić operatorom definiowalne przez użytkownika?

Mogą być bardzo przydatne do dołączania nowych operacji infiksowania do różnych symboli Unicode. Problem polega na tym, że w D żetony mają być całkowicie niezależne od analizy semantycznej. Zdefiniowane przez użytkownika operatory mogłyby to złamać.

2

O ile procedura zastosowana do argumentów w kombinacji Lisp nazywa się "operatorem", to tak, można zdefiniować nowe operatory, dopóki krowy nie wrócą do domu.

1

Myślę, że powinieneś głęboko pomyśleć o tym, dlaczego chcesz korzystać z tej funkcji. Wydaje mi się, że wybór języka jest o wiele ważniejszy.

Mogę tylko myśleć o jednym możliwym znaczeniu słowa "operator" w tym kontekście, który jest po prostu cukrem syntaktycznym dla wywołania funkcji, np. foo + bar zostanie przetłumaczone jako wywołanie funkcji +(a, b).

Jest to czasami przydatne, ale nie często. Mogę myśleć o bardzo niewielu przypadkach, w których przeciąłem/zdefiniowałem operatora.

Jak wspomniano w innych odpowiedziach, Haskell pozwala na definiowanie nowych operatorów infiksów. Jednak czysto funkcjonalny język z leniwą oceną może być odrobiną kęsa. Prawdopodobnie poleciłbym SML ponad Haskell, jeśli po raz pierwszy masz ochotę wypróbować funkcjonalny język. System typu jest nieco prostszy, można używać efektów ubocznych i nie jest on leniwy.

F # jest również bardzo interesujący, a także oferuje units of measure, który AFAIK jest unikalny dla tego języka. Jeśli potrzebujesz tej funkcji, może być nieoceniona.

W czołówce nie mogę wymyślić żadnych statycznie napisanych języków imperatywnych z operatorami infiksów, ale i tak możesz chcieć użyć języka funkcyjnego do programowania matematycznego, ponieważ znacznie łatwiej jest udowodnić fakty o funkcjonalności. program.

Możesz także chcieć utworzyć małe DSL, jeśli problemy z syntezą, takie jak operatory infiksów, są dla ciebie tak ważne. Następnie możesz napisać program w dowolnym języku i nadal określać matematykę w wygodny sposób.

+0

Biblioteka "boost" C++ "Units" zapewnia analizę wymiarową w czasie kompilacji podobną do jednostek miary F #. –

2

Zarówno ocaml, jak i f# mają operatorów infiksów. Mają specjalny zestaw znaków, które są dozwolone w ich składni, ale oba mogą być używane do manipulowania innymi symbolami, aby użyć dowolnego infiksowania funkcji (patrz: ocaml discussion).

0

Możesz rzeczywiście zrobić to, czego potrzebujesz, używając przeciążenia operatora C#.

Przykład:

public static Complex operator -(Complex c) 
{ 
    Complex temp = new Complex(); 
    temp.x = -c.x; 
    temp.y = -c.y; 
    return temp; 
} 

+0

Tak, to prawda, ale nie możesz definiować nowych operatorów, więc jesteś ograniczony do operatorów +, -, *, /, i innych. Ale co, jeśli masz dwa zestawy i chcesz uzyskać połączenie dwóch? Czy naprawdę musisz przejść i zdefiniować statyczną funkcję set.union (setA, setB)? – niklasfi

1

Co masz na myśli przez silnego typowania? Masz na myśli pisanie statyczne (gdzie wszystko ma typ znany w czasie kompilacji, a konwersje są ograniczone) lub silne pisanie (wszystko ma typ znany w czasie wykonywania, a konwersje są ograniczone)?

Poszedłbym z Common Lisp. W rzeczywistości nie ma operatorów (na przykład dodanie aib to (+ a b)), ale raczej funkcje, które można dowolnie definiować. Ma silne wpisywanie, że każdy obiekt ma określony typ, nawet jeśli nie można go poznać w czasie kompilacji, a konwersje są ograniczone. To naprawdę świetny język do programowania eksploracyjnego i wygląda na to, że właśnie to robisz.

1

Ruby does.

require 'rubygems' 
require 'superators' 

class Array 
    superator "<---" do |operand| 
    self << operand.reverse 
    end 
end 

["jay"] <--- "spillihp" 
Powiązane problemy