Python kontra Ruby do metaprogramowania [zamknięte]

90

Obecnie jestem głównie programistą D i zamierzam dodać inny język do mojego zestawu narzędzi, najlepiej taki, który obsługuje hacki do metaprogramowania, których po prostu nie można wykonać w języku skompilowanym statycznie, takim jak D.

Przeczytałem trochę o Lispie i chciałbym znaleźć język, który pozwala na niektóre fajne rzeczy, które robi Lisp, ale bez dziwnej składni itp. Lispa. Nie chcę rozpoczynać wojny z płomieniami językowymi i jestem pewien, że zarówno Ruby, jak i Python mają swoje kompromisy, więc wymienię to, co jest dla mnie ważne osobiście. Proszę, powiedz mi, czy Ruby, Python lub inny język byłby dla mnie najlepszy.

Ważny:

  1. Dobre metaprogramowanie. Możliwość tworzenia klas, metod, funkcji itp. W czasie wykonywania. Najlepiej minimalne rozróżnienie między kodem a danymi, styl Lisp.
  2. Ładna, przejrzysta, rozsądna składnia i spójna, intuicyjna semantyka. Zasadniczo dobrze przemyślany, przyjemny w użyciu, nowoczesny język.
  3. Wiele paradygmatów. Żaden paradygmat nie jest odpowiedni dla każdego projektu, a nawet każdego małego podproblemu w projekcie.
  4. Ciekawy język, który faktycznie wpływa na sposób myślenia o programowaniu.

Dość ważne:

  1. Występ. Byłoby miło, gdyby wydajność była przyzwoita, ale gdy wydajność jest prawdziwym priorytetem, zamiast tego użyję D.
  2. Dobrze udokumentowane.

Nieważne:

  1. Wielkość społeczności, dostępność bibliotek itp. Żadna z tych cech nie jest cechą samego języka i wszystko może się bardzo szybko zmienić.
  2. Dostępność pracy. Nie jestem pełnoetatowym, profesjonalnym programistą. Jestem studentem studiów magisterskich i programowanie jest stycznie istotne dla moich badań.
  3. Wszelkie funkcje, które zostały zaprojektowane głównie z myślą o bardzo dużych projektach, nad którymi pracuje milion małp kodu.
dsimcha
źródło
1
+1 za ogólnie dobrze zadawane pytanie.
Tryptyk
Niestety, wszystkie wysoko oceniane odpowiedzi zasadniczo mówią „to zależy”, a niższe odpowiedzi to w zasadzie wojna płomieni Python kontra Ruby.
Dan Burton,
Czy rozważałeś Clojure?
Mark Thomas,
Odpowiedź brzmi: Julia ! Po prostu wtedy nie istniało: bit.ly/julia_meta ... raduj się! Julia obejmuje wszystkie ważne punkty wymienione przez @dsimcha, a także wydajność, a wszystkie inne punkty stają się prawdziwe, ponieważ Julia wciąż dojrzewa.
SalchiPapa

Odpowiedzi:

15

Tak naprawdę nie ma dużej różnicy między Pythonem a Rubinem, przynajmniej na poziomie ideologicznym. W większości są to po prostu różne smaki tego samego. Dlatego radziłbym sprawdzić, który z nich bardziej pasuje do twojego stylu programowania.

Jason Baker
źródło
30
Zdecydowanie nie jest to to samo. Wygląda podobnie na powierzchni, ale jeśli korzystasz z najpotężniejszych funkcji Rubiego, rozumiesz, że Python po prostu nie pasuje. Na przykład spróbuj napisać DSL w Rubim zamiast pisać jeden Python lub tworzyć funkcje, metody, klasy itp. W czasie wykonywania. W Rubim jest znacznie prostszy.
FelipeC
14
Nierzadko trzeba wykonać metaprogramowanie, po prostu rzadko się to robi. Wszystkie programy, z wyjątkiem najbardziej trywialnych, mają powtarzające się wzorce, które nie należą do zwykłych narzędzi do refaktoryzacji, ale można je łatwo usunąć za pomocą metaprogramowania.
Wayne Conrad
10
Ruby i Python są bardzo różne, nawet jeśli chodzi o pomysły, które rządzą ich projektem. Python chcą jednego i miejmy nadzieję jednego oczywistego sposobu robienia rzeczy. To sprawia, że ​​język nie jest tak wyrazisty jak Ruby, ale czyni go bardziej spójnym. Ruby wywodzi się nieco bardziej z podejścia Perla, gdzie jest wiele sposobów wykonywania różnych czynności. Również Ruby sprawia, że ​​niektóre rzeczy są bardzo proste i faktycznie zawiera pomysł prywatnych członków. Z drugiej strony Python co najwyżej sprawia, że ​​coś jest trudniejsze do zrobienia, więc musisz być bardziej wyraźny (na przykład dodawanie lub nadpisywanie zachowania na klasach).
Sean Copenhaver
5
Prawdopodobnie powinieneś zrobić szybki kurs z obu, ale dla łatwego metaprogramowania wydaje się, że Ruby jest bardziej odpowiedni. Nie mam jednak dużego doświadczenia, więc traktuj to z przymrużeniem oka.
Sean Copenhaver,
7
Ruby i Python są podobne tylko w tym, że głoszą „piękny kod”. Oni po prostu mają zupełnie różne poglądy na temat tego piękna rzecz (który IMO jest dobry)
Gabi Purcaru
69

Przeczytałem trochę o Lispie i chciałbym znaleźć język, który pozwala na niektóre fajne rzeczy, które robi Lisp, ale bez dziwnej składni itp. Lispa.

Czy nie wszyscy.

minimalne rozróżnienie między kodem a danymi, styl Lisp

Niestety, minimalne rozróżnienie między kodem a danymi oraz „dziwna” składnia są wzajemnymi konsekwencjami.

Jeśli potrzebujesz łatwej do odczytania składni, masz Pythona. Jednak kod nie jest reprezentowany w żadnej z powszechnie używanych wbudowanych struktur danych. Nie udaje się - jak większość języków - na pierwszym miejscu listy „ważnych”. To utrudnia udzielenie użytecznej pomocy.

Nie możesz mieć tego wszystkiego. Pamiętaj, że nie jesteś pierwszą osobą, która ma taką myśl. Gdyby istniało coś takiego jak twój idealny język, wszyscy byśmy go używali. Ponieważ prawdziwy świat nie spełnia twoich ideałów, będziesz musiał zmienić priorytety swojej listy życzeń. Sekcja „ważne” musi zostać uporządkowana, aby określić, co jest dla Ciebie naprawdę ważne.

S.Lott
źródło
3
Odkryłem, że wiele języków implementuje makra podobne do Lispa w składniach innych niż Lispy i kończy się to, że pisanie tam makr jest bardzo trudne, ponieważ nikt naturalnie nie zna struktur danych, w których reprezentowany jest kod, więc pisanie makr staje się zbyt trudne i nikt tego nie robi.
pupeno
11
Ludziom trudno jest czytać Lisp, ponieważ nie znają składni. Uważam, że Lisp jest znacznie łatwiejszy do odczytania niż C # (ale trudniejszy niż Python).
Jules
1
W dużej mierze zgadzam się z tym punktem, ale moje doświadczenia zarówno z Rubim, jak i Lispem pokazują, że pierwsza wersja jest równie dobra do metaprogramowania, jak to się robi bez nawiasów. Innymi bliskimi alternatywami mogą być TCL i JavaScript, ale nie preferowałbym ich z innych powodów.
inger
Dawno, dawno temu był język o nazwie Dylan, który powinien być dokładnie taki.
Friedrich
17

Szczerze mówiąc, jeśli chodzi o możliwości metaprogramowania, Ruby i Python są o wiele bardziej podobne, niż niektórzy z ich zwolenników lubią przyznawać. Ta recenzja obu języków oferuje całkiem dobre porównanie / recenzję:

Więc po prostu wybierz jeden na podstawie pewnych kryteriów. Może lubisz Railsy i chcesz przestudiować ten kod. Może SciPy to twoja sprawa. Przyjrzyj się ekosystemowi bibliotek, społeczności itp. I wybierz jeden. Z pewnością nie stracisz na nirwanie metaprogramowania opartej na twoim wyborze.

ars
źródło
ten wpis na blogu wydaje się mieć więcej wspólnego z osobistymi preferencjami (całkiem słuszne, ale piękno zależy od patrzącego), a nie z metaprogramowaniem - co było głównym celem PO.
inger
16

Zastrzeżenie: gram tylko w jednym z języków, ale przynajmniej napisałem małe działające programy (nie tylko szybkie skrypty, do których używam Perla, bash lub GNU make) w obu.

Ruby może być naprawdę fajny w punkcie 3 „wielu paradygmatów”, ponieważ ciężko pracuje, aby ułatwić tworzenie języków specyficznych dla domeny. Na przykład przeglądaj online i spójrz na kilka bitów kodu Ruby on Rails oraz kilka bitów kodu Rake. Oba są Rubinami i możesz zobaczyć podobieństwa, ale nie wyglądają tak, jak zwykle myślisz o tym samym języku.

Wydaje mi się, że Python jest nieco bardziej przewidywalny (prawdopodobnie skorelowany z `` czystym '' i `` rozsądnym '' punktem 2), ale tak naprawdę nie wiem, czy to z powodu samego języka, czy po prostu tego, że jest zwykle używany przez osoby o innych wartościach . Nigdy nie próbowałem korzystać z głębokiej magii w Pythonie. Z pewnością powiedziałbym, że oba języki są dobrze przemyślane.

Oba uzyskują dobre wyniki w punktach 1 i 4. [Edycja: właściwie 1 jest dość dyskusyjna - w obu jest „eval”, podobnie jak w językach interpretowanych, ale nie są one konceptualnie czyste. Możesz definiować zamknięcia, przypisywać metody do obiektów i tak dalej. Nie jestem pewien, czy to idzie tak daleko, jak chcesz.]

Osobiście uważam, że Ruby jest bardziej zabawny, ale po części dlatego, że łatwiej jest się rozproszyć myśląc o fajnych sposobach robienia rzeczy. Właściwie częściej używałem Pythona. Czasami nie chcesz fajnie, chcesz się z tym pogodzić, więc robi się to przed snem ...

Żadne z nich nie jest trudne do zdobycia, więc możesz po prostu zdecydować się na wykonanie następnego drobnego zadania w jednym, a następne w drugim. Lub weź ze sobą książkę wprowadzającą do każdej z bibliotek, przejrzyj obie i zobacz, co Cię porywa.

Steve Jessop
źródło
15

Czy rozważałeś Smalltalk? Oferuje bardzo prostą, przejrzystą i rozszerzalną składnię z możliwościami odzwierciedlania i introspekcji oraz w pełni zintegrowanym środowiskiem programistycznym, które wykorzystuje te możliwości. Spójrz na przykład na niektóre prace wykonywane w Squeak Smalltalk . Wielu badaczy korzystających ze Squeaka spędza czas na liście mailingowej Squeak i #squeak na freenode, więc możesz bardzo łatwo uzyskać pomoc w złożonych problemach.

Inne wskaźniki jego aktualnego znaczenia: działa na dowolnej platformie, którą chciałbyś nazwać (w tym na iPhonie ); Gilad Bracha opiera swoją nowomowę na Squeaku; zespół V8 wyciął zęby na maszynach wirtualnych Smalltalk ; a Dan Ingalls i Randal Schwartz niedawno wrócili do pracy w Smalltalk po latach spędzonych na pustyni.

Powodzenia w wyszukiwaniu - na koniec daj nam znać, na co zdecydujesz.

mykdavies
źródło
14

Lisp spełnia wszystkie twoje kryteria, w tym wydajność, i jest jedynym językiem, który nie ma (dziwnej) składni. Jeśli unikniesz tego na tak zdumiewająco niedoinformowanej / nieudolnej podstawie iw konsekwencji przegapisz doświadczenie używania np. Emacs + SLIME + CL, wyrządzisz sobie wielką krzywdę.

user23611
źródło
4
Lub możesz spróbować Clojure, który uważam za bardzo fajny.
pupeno
1
Zdecydowanie się zgadzam. Jeśli chcesz mocy Lispa, po prostu zanurz się i miej ją! Właściwie dość łatwo jest przyzwyczaić się do parenów; nie są tak ważne, jak uważa większość ludzi.
Dan Burton,
11

Twoje 4 „ważne” punkty prowadzą dokładnie do Rubiego, podczas gdy 2 „dość ważne” punkty są rządzone przez Pythona. Niech tak będzie.

Neo
źródło
11

Opisujesz Rubiego.

  • Dobre metaprogramowanie. Możliwość tworzenia klas, metod, funkcji itp. W czasie wykonywania. Najlepiej minimalne rozróżnienie między kodem a danymi, styl Lisp.

Bardzo łatwo jest rozszerzać i modyfikować istniejące prymitywy w czasie wykonywania. W Rubim wszystko jest obiektem, łańcuchami znaków, liczbami całkowitymi, a nawet funkcjami.

Możesz także konstruować skróty do cukru składniowego, na przykład za pomocą class_eval .

  • Ładna, przejrzysta, rozsądna składnia i spójna, intuicyjna semantyka. Zasadniczo dobrze przemyślany, przyjemny w użyciu, nowoczesny język.

Ruby kieruje się zasadą mniejszego zaskoczenia i porównując kod Rubiego z jego odpowiednikiem w innym języku, wiele osób uważa go za bardziej „piękny”.

  • Wiele paradygmatów. Żaden paradygmat nie jest odpowiedni dla każdego projektu, a nawet każdego małego podproblemu w projekcie.

Możesz śledzić imperatyw, obiektowy, funkcjonalny i refleksyjny.

  • Ciekawy język, który faktycznie wpływa na sposób myślenia o programowaniu.

To bardzo subiektywne, ale z mojego punktu widzenia umiejętność posługiwania się wieloma paradygmatami jednocześnie pozwala na bardzo ciekawe pomysły.

Wypróbowałem Python i nie pasuje do twoich ważnych punktów.

FelipeC
źródło
11
-1 Używam Pythona i pasuje on doskonale, różnice między Pythonem a Rubim dotyczą innych aspektów. Hałasem w stylu Fanboya, jesteś.
gorsky
6
Dużo gadania, ale żadnego spaceru. Chcesz podać przykład w Pythonie dynamicznego dodawania metody, aby powiedzieć, że klasa String?
FelipeC
6
@john Dokładnie o to mi chodzi; jest bardzo skomplikowany i brzydki (nie wspominając o niemożliwości dla klasy String). OTOH w Rubim jest bardzo proste: "self.class.send (: define_method,: method_name) {method_code}"
FelipeC
2
Ruby może próbować postępować zgodnie z PoLS, ale nie powiedziałbym, że tak . Na przykład, bałagan lambda/ Proc.newzostał nazwany „zaskakującym zachowaniem” i „wysoce sprzeczny z intuicją” w SO. :-) Każdy język tak duży i złożony jak Ruby ma takie zagmatwane obszary.
Ken
2
@Token oto przykład małpiego łatania Stringw Rubim do celów metaprogramowania: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Podklasy nie wystarczą; jednak wystarczyłaby prosta funkcja dwuargumentowa.
P Shved
8

Porównaj przykłady kodu, które robią to samo (połącz z niepustymi opisami elementów z plikumyList listy w ) w różnych językach (języki są ułożone w odwrotnej kolejności alfabetycznej):

Rubin :

myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")

Lub

myList.map(&:description).reject(&:empty?).join("\n")

Python :

descriptions = (f.description() for f in mylist)
"\n".join(filter(len, descriptions)) 

Lub

"\n".join(f.description() for f in mylist if f.description())

Perl :

join "\n", grep { $_ } map { $_->description } @myList;

Lub

join "\n", grep /./, map { $_->description } @myList;

JavaScript :

myList.map(function(e) e.description())
      .filter(function(e) e).join("\n")

Io :

myList collect(description) select(!="") join("\n")

Oto plik przewodnik po Io .

J.F. Sebastian
źródło
3
(format nil "~ {~ a ~ ^ ~% ~}" (usuń nil (mapcar # 'opis mylista)))
Rainer Joswig
fajnie, ale gdzie jest tutaj metaprogramowanie? wydaje się, że jest to nieco funkcjonalny styl, zdalnie powiązany z pytaniem.
inger
6

Ruby byłby lepszy niż Lisp pod względem bycia „głównym nurtem” (cokolwiek to naprawdę oznacza, ale jedną realistyczną troską jest to, jak łatwo byłoby znaleźć odpowiedzi na pytania dotyczące programowania w Lispie, gdybyś się z tym zgodził). , Uważam, że Ruby jest bardzo łatwy do opanowania. W tym samym czasie, który spędziłem na nauce Pythona (lub innych języków), wkrótce pisałem lepszy kod, znacznie wydajniej niż kiedykolwiek wcześniej. Jednak to tylko opinia jednej osoby; weź to chyba z przymrużeniem oka. Wiem znacznie więcej o Rubim w tym momencie niż Python czy Lisp, ale powinieneś wiedzieć, że byłem osobą Pythona przez jakiś czas, zanim się przełączyłem.

Lisp jest zdecydowanie fajny i wart uwagi; jak powiedziałeś, wielkość społeczności itp. może się dość szybko zmienić. Biorąc to pod uwagę, sam rozmiar nie jest tak ważny, jak jakość społeczności. Na przykład #ruby-langkanał nadal jest wypełniony niesamowicie inteligentnymi ludźmi. Wydaje się, że Lisp przyciąga też naprawdę sprytnych ludzi. Nie mogę wiele mówić o społeczności Pythona, ponieważ nie mam dużego doświadczenia z pierwszej ręki, ale czasami wydaje się, że jest ona „zbyt duża”. (Pamiętam, że ludzie byli dość niegrzeczni na swoim kanale IRC iz tego, co słyszałem od znajomych, którzy naprawdę interesują się Pythonem, wydaje się, że jest to raczej zasada niż wyjątek).

W każdym razie niektóre zasoby, które mogą okazać się przydatne, to:

1) Seria Pragmatic Programmers Ruby Metaprogramming ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - nie jest darmowa, ale późniejsze odcinki są dość intrygujące. (Kod jest bezpłatny, jeśli chcesz go pobrać i zobaczyć, o czym się dowiesz.)

2) On Lisp autorstwa Paula Grahama ( http://www.paulgraham.com/onlisp.html ). Jest trochę stary, ale jest klasyczny (i można go pobrać za darmo).

Benjamin Oakes
źródło
5

Używam Pythona w wielu projektach i myślę, że Python zapewnia wszystkie funkcje, o które prosiłeś.

ważny:

  1. Metaprogramowanie: Python obsługuje metaklasy i generowanie klas / metod w czasie wykonywania itp
  2. Składnia: Cóż, to w jakiś sposób subiektywne. Lubię składnię Pythona ze względu na jej prostotę, ale niektórzy ludzie narzekają, że Python jest wrażliwy na białe znaki.
  3. Paradygmaty: Python obsługuje programowanie proceduralne, obiektowe i podstawowe programowanie funkcjonalne.
  4. Myślę, że Python ma bardzo praktyczny styl, był dla mnie bardzo inspirujący.

Dość ważne:

  1. Wydajność: Cóż, to język skryptowy. Ale pisanie rozszerzeń C dla Pythona jest powszechną praktyką optymalizacyjną.
  2. Dokumentacja: nie mogę narzekać. Nie jest tak szczegółowe, jak ktoś może znać z Javy, ale jest wystarczająco dobre.

Jako doktorant, możesz przeczytać ten artykuł, twierdząc, że Python jest wszystkim, czego potrzebuje naukowiec . Niestety nie mogę porównać Pythona z Rubim, ponieważ nigdy nie używałem tego języka.

Pozdrawiam, Dennis

xardias
źródło
3
Python nie jest wrażliwy na białe znaki. Jest wrażliwy na wcięcia.
jfs
5

@Jason I odpowiednio się nie zgadzam. Istnieją różnice, które sprawiają, że Ruby jest lepszy od Pythona w metaprogramowaniu - zarówno filozoficznym, jak i pragmatycznym. Na początek Ruby ma prawo dziedziczenia dzięki Single Inheritance i Mixins . A jeśli chodzi o metaprogramowanie, po prostu musisz zrozumieć, że chodzi o jaźń . Kanoniczna różnica polega na tym, że w Rubim masz dostęp do obiektu self w czasie wykonywania - w Pythonie nie!

W przeciwieństwie do Pythona, w Rubim nie ma oddzielnej fazy kompilacji lub uruchomienia. W Rubim każda linia kodu jest wykonywana na konkretnym obiekcie self . W Rubim każda klasa dziedziczy zarówno z obiektu, jak i ukrytej metaklasy. To daje interesującą dynamikę:

class Ninja
  def rank
    puts "Orange Clan"
  end

  self.name #=> "Ninja"
end

Korzystanie self.name dostępów metaklasa przez Ninja klasa ta nazwa metody, aby powrócić nazwę klasy Ninja. Czy metaprogramowanie jest tak piękne w Pythonie? Szczerze w to wątpię!

Eric Davidson
źródło
4

Cóż, jeśli nie podoba ci się składnia lisp, być może najlepszym rozwiązaniem będzie assembler. :-)

Z pewnością ma minimalne rozróżnienie między kodem a danymi, jest wieloparadygmatem (a może to nie jest paradygmat) i jest to rozwijające umysł (jeśli nudne) doświadczenie zarówno pod względem uczenia się, jak i sztuczek, które możesz wykonać.

rickardg
źródło
Myślę, że zrobiłem więcej meta programowania w języku asemblera niż w jakimkolwiek innym języku. Kod to dane, a dane mogą próbować być kodem. A dane nie są podpisane ani niepodpisane, decyduje kod operacyjny.
Nosredna
1
Mam kod asemblera, który możesz twierdzić, że jest OO. Ma rzeczy, które wyglądają raczej jak metody - wywołujesz tę, która zależy od „klasy”.
justintime
4

Io spełnia wszystkie Twoje „Ważne” punkty. Nie sądzę, że istnieje lepszy język do robienia szalonych meta hackerów.

frigolitmonster
źródło
Dzięki za to, nie wiedziałem o tym. Na pierwszy rzut oka wygląda fajnie, może dużo (()), ale i tak. Mam nadzieję, że wkrótce znajdę czas, żeby się im przyjrzeć.
flq
3

taki, który obsługuje hacki do metaprogramowania, które właśnie nie można wykonać w statycznie skompilowanym języku

Bardzo chciałbym znaleźć język, który pozwala na niektóre fajne rzeczy, które robi Lisp

Lisp można skompilować.

RHSeeger
źródło
3

Czy próbowałeś Rebol?

Zaraz
źródło
3

Moja odpowiedź byłaby żadna. Znam oba języki, uczęszczałem na zajęcia z Rubiego i od kilku lat programuję w Pythonie. Lisp jest dobry w metaprogramowaniu, ponieważ jego jedynym celem jest transformacja list, jego własny kod źródłowy to tylko lista tokenów, więc metaprogramowanie jest naturalne. Trzy języki, które najbardziej lubię do tego typu rzeczy to Rebol, Forth i Factor. Rebol jest bardzo silnym językiem dialektacyjnym, który pobiera kod ze strumienia wejściowego, wykonuje przeciwko niemu wyrażenie i przekształca je za pomocą reguł napisanych w tym języku. Bardzo wyrazista i wyjątkowo dobra w wybieraniu. Czynnik i Forth są mniej więcej całkowicie oddzielone od składni i programujesz je przez definiowanie i wywoływanie słów. Zazwyczaj są napisane w ich własnym języku. Nie piszesz aplikacji w tradycyjnym sensie, rozszerzasz język, pisząc własne słowa, aby zdefiniować konkretną aplikację. Factor może być szczególnie przyjemny, ponieważ ma wiele funkcji, które widziałem tylko w smalltalk do oceny i pracy z kodem źródłowym. Naprawdę fajne miejsce do pracy, interaktywne dokumenty itp.

ToddB
źródło
2

Tak naprawdę nie ma wiele do oddzielenia Pythona od Rubiego. Powiedziałbym, że społeczność Pythona jest większa i bardziej dojrzała niż społeczność Rubiego, a to jest dla mnie naprawdę ważne. Ruby jest bardziej elastycznym językiem, który ma pozytywne i negatywne reperkusje. Jestem jednak pewien, że będzie mnóstwo osób, które będą szczegółowo omawiać oba te języki, więc wrzucę trzecią opcję do ringu. A co z JavaScriptem?

JavaScript został pierwotnie zaprojektowany jako Scheme dla sieci Web i jest oparty na prototypach, co jest zaletą w stosunku do Pythona i Ruby, jeśli chodzi o wieloparadygmat i metaprogramowanie. Składnia nie jest tak ładna, jak pozostałe dwa, ale jest to prawdopodobnie najbardziej rozpowszechniony język, który istnieje, a wydajność jest coraz lepsza z każdym dniem.

Jim
źródło
2

Jeśli podoba Ci się koncepcja code-is-data w stylu lisp, ale nie lubisz składni Lispy, może Prolog będzie dobrym wyborem.

To, czy kwalifikuje się to jako „zabawny w użyciu, nowoczesny język”, pozostawię innym do oceny. ;-)

JesperE
źródło
2

Ruby to mój wybór po zapoznaniu się z Pythonem, Smalltalk i Ruby.

ryw
źródło
2

A co z OCaml?

Funkcje OCaml: statyczny system typów, wnioskowanie o typie, parametryczny polimorfizm, rekurencja ogonowa, dopasowywanie wzorców, zamknięcia leksykalne pierwszej klasy, funktory (moduły parametryczne), obsługa wyjątków i przyrostowe generacyjne automatyczne usuwanie elementów bezużytecznych.

Myślę, że spełnia następujące warunki:

Ważny:

  1. Ładna, przejrzysta, rozsądna składnia i spójna, intuicyjna semantyka. Zasadniczo dobrze przemyślany, przyjemny w użyciu, nowoczesny język.
  2. Wiele paradygmatów. Żaden paradygmat nie jest odpowiedni dla każdego projektu, a nawet każdego małego podproblemu w projekcie.
  3. Ciekawy język, który faktycznie wpływa na sposób myślenia o programowaniu.

Dość ważne:

  1. Występ. Byłoby miło, gdyby wydajność była przyzwoita, ale gdy wydajność jest prawdziwym priorytetem, zamiast tego użyję D.
  2. Dobrze udokumentowane.
Roberta Vukovicia
źródło
OCaml umożliwia tworzenie klas / metod w czasie wykonywania? Jak to działa?
Jason Creighton
Właśnie przeczytałem o OCaml i być może nie może on tworzyć rzeczy w czasie wykonywania, więc go usunąłem.
Robert Vuković
2

Trochę używam Pythona, ale znacznie więcej Rubiego. Jednak twierdzę, że oba zapewniają to, o co prosiłeś.

Jeśli zobaczę wszystkie cztery punkty, możesz przynajmniej sprawdzić: http://www.iolanguage.com/

Mozart / Oz może być również dla Ciebie interesujący: http://mozart.github.io/

Pozdrawiam Friedrich

Friedrich
źródło
1

Aby uzyskać informacje na temat składni w stylu Pythona i makr podobnych do lisp (makra, które są prawdziwym kodem) i dobrego DSL, zobacz converge .

Kasprzol
źródło
1

Nie jestem pewien, czy Python spełni wszystko, czego pragniesz (zwłaszcza kwestia minimalnego rozróżnienia między kodem a danymi), ale jest jeden argument przemawiający za Pythonem. Istnieje projekt, który ułatwia programowanie rozszerzeń dla Pythona w D, dzięki czemu można mieć to, co najlepsze z obu światów. http://pyd.dsource.org/celerid.html

Mauli
źródło
1

jeśli kochasz różę, musisz nauczyć się żyć z cierniami :)

AgentOrange
źródło
1

Poleciłbym ci wybrać Ruby.

Kiedy po raz pierwszy zacząłem się go uczyć, było to dla mnie naprawdę łatwe.

Mardix
źródło
1

Nie mieszaj języka programowania Ruby z implementacjami Ruby, myśląc, że wątki POSIX nie są możliwe w Ruby.

Możesz po prostu skompilować z obsługą pthread, a było to już możliwe w czasie tworzenia tego wątku , jeśli wybaczysz kalambur.

Odpowiedź na to pytanie jest prosta. Jeśli lubisz seplenienie, prawdopodobnie wolisz rubin. Albo cokolwiek chcesz.

anonimowości
źródło
0

Proponuję wypróbować oba języki i wybrać ten, który ci się podoba. Zarówno Python, jak i Ruby mogą robić, co chcesz.

Przeczytaj także ten wątek .

Alexander Kojevnikov
źródło
0

Idź z JS, po prostu sprawdź AJS (alternatywna składnia JavaScript) na moim github http://github.com/visionmedia , da ci kilka bardziej przejrzystych zamknięć itp .: D

TJ Holowaychuk
źródło
0

Odnośnie twojego głównego punktu (metaprogramowanie): Wersja 1.6 Groovy ma wbudowane programowanie AST (Abstract Syntax Tree) jako standardową i zintegrowaną funkcję. Ruby ma RubyParser, ale jest to dodatek.

groovy
źródło