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:
- Dobre metaprogramowanie. Możliwość tworzenia klas, metod, funkcji itp. W czasie wykonywania. Najlepiej minimalne rozróżnienie między kodem a danymi, styl Lisp.
- Ładna, przejrzysta, rozsądna składnia i spójna, intuicyjna semantyka. Zasadniczo dobrze przemyślany, przyjemny w użyciu, nowoczesny język.
- Wiele paradygmatów. Żaden paradygmat nie jest odpowiedni dla każdego projektu, a nawet każdego małego podproblemu w projekcie.
- Ciekawy język, który faktycznie wpływa na sposób myślenia o programowaniu.
Dość ważne:
- Występ. Byłoby miło, gdyby wydajność była przyzwoita, ale gdy wydajność jest prawdziwym priorytetem, zamiast tego użyję D.
- Dobrze udokumentowane.
Nieważne:
- 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ć.
- Dostępność pracy. Nie jestem pełnoetatowym, profesjonalnym programistą. Jestem studentem studiów magisterskich i programowanie jest stycznie istotne dla moich badań.
- 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.
python
ruby
lisp
metaprogramming
dsimcha
źródło
źródło
Odpowiedzi:
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.
źródło
Czy nie wszyscy.
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.
źródło
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.
źródło
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.
źródło
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.
źródło
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ę.
źródło
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.
źródło
Opisujesz Rubiego.
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 .
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”.
Możesz śledzić imperatyw, obiektowy, funkcjonalny i refleksyjny.
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.
źródło
lambda
/Proc.new
został 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.String
w 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.Porównaj przykłady kodu, które robią to samo (połącz z niepustymi opisami elementów z pliku
myList
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 .
źródło
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-lang
kanał 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).
źródło
Używam Pythona w wielu projektach i myślę, że Python zapewnia wszystkie funkcje, o które prosiłeś.
ważny:
Dość ważne:
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
źródło
@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ę!
źródło
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ć.
źródło
Io spełnia wszystkie Twoje „Ważne” punkty. Nie sądzę, że istnieje lepszy język do robienia szalonych meta hackerów.
źródło
Lisp można skompilować.
źródło
Czy próbowałeś Rebol?
źródło
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.
źródło
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.
źródło
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. ;-)
źródło
Ruby to mój wybór po zapoznaniu się z Pythonem, Smalltalk i Ruby.
źródło
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:
źródło
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
źródło
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 .
źródło
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
źródło
jeśli kochasz różę, musisz nauczyć się żyć z cierniami :)
źródło
Poleciłbym ci wybrać Ruby.
Kiedy po raz pierwszy zacząłem się go uczyć, było to dla mnie naprawdę łatwe.
źródło
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.
źródło
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 .
źródło
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
źródło
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.
źródło