Rawr
Zima idzie, trzeba kilku zmian w swoim życiu. Po pierwsze, już dawno zauważyłem że PHP, język który poznałem najlepiej, stoi w miejscu (czy nawet się cofa), więc trzeba się czegoś nowego nauczyć, by mieć czym szpanować na IRCu.
Wybór padł na Ruby – kiedyś już nawet próbowałem, ale wtedy mnie odrzuciła – wydawało się – dziwna składnia.
Teraz jednak się do niej w pełni przekonałem – bo żadnej „jedynej prawdziwej” składni nie ma, można pisać tak jak się lubi. W tej chwili „dziwna” praktyka w stylu 5.times{ |a| puts a } wydaje się czymś zupełnie normalnym, w dodatku niesamowicie wygodnym. Jak się trochę poduczę to może powstanie nowa kategoria na joggu ;-)
Druga rzecz to nowy layout, ukradziony z oswd.org – miał być inny, ale się okazało że już ktoś już go przeportował na Joggera, zdrajca jeden… a ten tutaj to „bitter sweet”. Okrojony, uznałem że nie potrzebuję wszystkich funkcji i tagów jakie udostępnia Jogger.
ps. def x; yield end; x{ puts „hai” }; rulz :)
Ktoś już ma bardzo podobny :P
E tam, Ruby to Lisp z brzydką składnią.
snufkin: Nie załamuj mnie :P
Dodek: eeee, czyli jakby zamiast spacji używano nawias+spacja to by była ładna? o_O
IMO Lisp właśnie ma najbrzydszą składnię ze wszystkich języków.
Ruby to Lisp?
Tom się ubawił ;)
puppy: powiedz mi, ile czasu pisałeś w Lispie, a powiem Ci, czy Twoje zdanie ma w ogóle jakiekolwiek znaczenie. Wypowiadanie się na temat składni Lispu bez minimum pół roku (no, powiedzmy 3 miesięcy) doświadczenia jest kompletną porażką.
sharnik: Co takiego ma Ruby, czego nie ma Common Lisp?
Dodek: Nie stwierdzam, że tak nie jest. Ruby to taki Lisp tak samo jak Ruby to taki Asembler. Wszystkie trzy są sprowadzalne do maszyny Turinga.
Zaraz zaraz – dlaczego muszę mieć jakiekolwiek pojęcie o języku, by ocenić jak brzydką ma składnię? Kod w Lisp jest po prostu BRZYDKI, nei widzę żadnego powodu by normalny język używał TYLU nawiasów. To jest lekka przesada, by absolutnie wszystko pakować w nawias.
Puppy: Masz całkowitą rację, pod warunkiem, że kierujesz się li tylko kryterium estetycznym.
puppy: :D no to wpadłeś, dla mnie Ruby jest brzydkie bo wprowadza masę zbędnej składni i cukru syntaktycznego – po kiego wała jakieś klamerki, średniki, pipe’y, operatory arytmetyczne, specjalne konstrukcje? Gdybyś miał doświadczenie w Lispie, to byś wiedział, po co jest tyle nawiasów – bez tych nawiasów nie mógłbyś mieć tak eleganckich makr – tak jak makr nie ma Ruby.
sharnik: Tak jest, ja się kieruję estetyką. Kod musi być ładny, czysty i schludny, bo jak widzę sieczkę w kodzie to się odechciewa pracować. Wszystko ma być proste i ładnie napisane. Ruby, jako jeden z nielicznych potrafi mi to zapewnić – kod wygląda tak jak ja sobie tego życzę.
Dodek: Średniki i pipe-y można w większości wywalić, specjalne konstrukcje są obecne w każdym Normalnym Języku™ dzięki czemu każdy programista czuje się „jak w domu”. Jeśli twierdzisz że definiowanie klasy czy funkcji to bloat – sorry. To jest język obiektowy, który jest znacznie wygodniejszy niż funkcyjny czy strukturalny. A funkcje lambda mi się dziwnie kojarzą z goto.
> A funkcje lambda mi się dziwnie kojarzą z goto.
Nie przejmuj się, przechodzi z czasem.
‘‘specjalne konstrukcje są obecne w każdym Normalnym Języku™ dzięki czemu każdy programista czuje się „jak w domu”.’‘
W Common Lispie specjalne operatory wyglądają tak samo jak zwykłe funkcje, różnią się tylko modelem ewaluacji, a przyzwyczajenie do nich naprawdę nie jest trudne.
‘‘Jeśli twierdzisz że definiowanie klasy czy funkcji to bloat – sorry.’‘
Nie, ja mówię, że do zdefiniowania klasy czy funkcji nie jest potrzebna żadna specjalna składnia :)
‘‘To jest język obiektowy, który jest znacznie wygodniejszy niż funkcyjny’‘
He he, a wiesz, że Twoje przykłady z artykuły są funkcyjne do bólu?
‘‘A funkcje lambda mi się dziwnie kojarzą z goto.’‘
He he, spuśćmy litościwie zasłonę milczenia na tę wypowiedź.
Nie nie, ja też je używam, ale jeśli cały język ma się o nie opierać, to trochę jak programowanie strukturalne i skakanie po kodzie z goto _
Przykłady? Nawet nie zwróciłem uwagi, być może. Ale za to pokazane też, że wszystko jest obiektem i mogę tym dowolnie operować.
Nie rozumiem też o co Ci Dodku chodzi – po co cały ten flame? Lisp mi się nie podoba – nazwij mnie dupkiem, nieukiem – cokolwiek. Nic mnie nie przekona do programowania w ten sposób, gdzie trzeba się szczycić tym, w jaki sposób dodajemy do siebie liczby.
A czego Lisp nie potrafi? Użyć tekstu jako obiektu. Lub liczby, lub czegokolwiek. Nie potrafi przemielić takiego kodu, jaki by mi odpowiadał (czy raczej – moim oczom).
Wybacz, ale najwyraźniej nie rozumiesz zupełnie, co to jest programowanie funkcyjne, jeżeli porównujesz je do goto/programowania strukturalnego.
Po co ten flejm – gdyby nie on, to pewnie dalej byś myślał, że Lisp jest stary i brzydki. Tak naprawdę te sexi cechy Ruby to cukier syntaktyczny na to, co Lisp miał od zawsze.
Common Lisp rzeczywiście tego nie potrafi domyślnie, nad czym mocno boleję, ale sama idea Lispu nie uniemożliwia tego. W gruncie rzeczy nawet w CL mogę zmienić składnię na tyle, żebym mógł dodawać metody do stringów. Napiszę o tym wpis na moim Joggerze.
Tfu, cofam to ostatnie, myślałem o czym innym – w CL domyślne funkcje są tylko funkcjami, a nie metodami. Nic nie stoi jednak na przeszkodzie użyć domyślnego obiektu jako do dispatchowania multimetod – wychodzi na to, że rzeczywiście muszę to szerzej opisać.
A gdzie tam Lisp. Podobno Ruby to miałbyć następcą Perl-a, tylko że zamiast po!@#$, czasem niezrozumiałej składni ma jeszcze bardziej po!@#$, całkowicie niezrozumiałą składnię ;P.
Hm, jak już mówiłem – Ruby ma taką składnię, jaką lubisz.
http://radarek.jogger.pl/2008/04/14/you-can-write-fortran-in-any-language/ – świetny wpis, pokazuje na ile sposobów można pisać.
„you-can-write-fortran-in-any-language”
...i Algola w C: http://minnie.tuhs.org/UnixTree/V7/usr/src/cmd/sh/ ;P
Ruby to ślepa uliczka. Naucz się Lispa i Perla. Jeśli ktoś nie docenia tych języków to znaczy, że ich nie zna. Porównywanie Lisp i Ruby jest już całkowitą nieznajomością tematu.
Dlaczego niby „ślepa uliczka”?
Poza tym Perl jest biedny – wszystko strukturalne. Ruby mi daje dokładnie to samo co perl, tylko bardziej mi odpowiada.
@a: a czym właściwie (prócz składni) się różni Ruby od Lispu? Albo lepiej, co takiego ma Ruby, czego nie może mieć Lisp? Ja porównuję, bo jak już powiedziałem, dla mnie Ruby to Lisp z masą zbędnego cukru syntaktycznego.
@puppy: po raz kolejny się popisujesz nieznajomością jęzków, o których mówisz. Perl ma obiektowość, ma domknięcia, funkcje jako obiekty pierwszej klasy… Nie wszystko strukturalne.
PS: Wydaje mi się, że wczoraj napisałem tu komentarz z linkiem opisującym system obiektowy w Lispie. Ciekawe, czemu zniknął, może spazm serwera, a może nie pasowało to do argumentacji przeciwnika.
Heh hah hoh. Ile jeszcze stereotypów muszę napisać, byście wpadli na to że ja naprawdę wiem co robię, wybierając Ruby? Może mam powód?
Co takiego ma Lisp czego nie ma Ruby? W ten sposób możemy się licytować do 2012 i nic z tego nie przyjdzie, bo oba języki są „kompletne”.
A żadnego komentarza nie usuwałem, sam się dziwiłem że nie podlinkowałeś.
Ależ ja nie wątpię, że masz powód, dla którego masz wybierasz Ruby. Po prostu dementuję te bzdury o innych językach, na podstawie których ktoś mógłby sobie wyrobić błędne zdanie na ich temat.
Pytanie „co takiego ma Lisp czego nie ma Ruby” miało na celu pokazanie, że rzeczywiście można je porównywać. Polecam lekturę http://www.randomhacks.net/articles/2005/12/03/why-ruby-is-an-acceptable-lisp , szczególnie komentarzy
Aha, no cóż, więc podlinkuję teraz:
http://dodek.jogger.pl/2008/11/09/clos-ogolny-opis-bez-mopa/
Nie masz edycji komentarzy, więc dorzucam w następnym to, o czym zapomniałem.
„Some may say Ruby is a bad rip-off of Lisp or Smalltalk, and I admit that. But it is nicer to ordinary people.”
- Matz, LL2
ale czy w programowaniu nie chodzi o to, by używać najwygodniejszych i najbardziej efektywnych narzędzi? W końcu wszyscy byśmy mogli pisać kod binarny, te wszystkie lispy, perle, php, c to tylko nędzne nakładki dla niedouczonych userów… Najważniejsze to mieć idealnie dopasowane narzędzie – ani Perl, ani Lisp nie spełniają moich wymagań, w dodatku mi się nie podoba ichnie podejście do programowania.
Ano właśnie widzisz, jak dla mnie Lisp jest najwygodniejszy i najbardziej efektywny, jeden z moich znajomych to samo powiedziałby o Haskellu, ty masz inne zdanie i chyba na tym warto zakończyć tę dyskusję.
Twoja ironia ma jedną lukę, PHP to rzeczywiscie nędzna nakładka :)
Aż zrobiłem kilka przykładów dlaczego to Ruby jest dla mnie idealnym językiem – takich rzeczy, w tak prosty sposób, chyba w żadnym innym nie zrobisz. (no, może poza js, moim drugim-ulubionym-języku). http://wklej.org/id/16668/ – o.
Ja tylko chciałem potrollować o Twoim nowym wspaniałym lejaucie. U mnie wygląda tak: http://tnij.org/xsnl :>
http://wklej.org/id/16939/
Taa.
Dodek: Chyba swoimi przykładami tylko potwierdziłeś zdanie puppy, że Ruby jest czytelniejszy ;)
No wiesz, może dla was – dla mnie ten kod jest bardziej czytelny, to, że nie wygląda podobnie do delphi nie znaczy, że jest nieczytelny…
Dodek: Akurat kod Delphi nie jest czytelny.
Dla każdego, który umie po angielsku Ruby jest czytelniejszy. Przyznaj, że jest to większa grupa niż tych co znają Lispa. Ergo, w większości przypadków Ruby jest czytelniejszy.
Doskonale wiem że Delphi nie jest czytelne, w gruncie rzeczy cały język jest beznadziejny w dzisiejszych realiach, mimo to jest cała masa jego użytkowników, dzieci, dla których Delphi było pierwszym językim i siłą rzeczy najlepszym. Jest to przykładem na to, że to nie liczba użytkowników świadczy o sile i jakości języka.
Składnia Lispa w trzech zdaniach. – Wyrażenia są złożone z list postaci (element1 element2 element3) – Pierwszy element listy to nazwa funkcji, a pozostałe to argumenty – Czasami zamiast funkcji mamy do czynienia z makrem, które generuje zwykły kod źródłowy (ale wywołanie wygląda tak samo jak wywołanie funkcji), czasami są też operatory specjalne, które różnią się od funkcji modelem ewaluacji argumentów.
Tak naprawdę powyżej opisałem całą składnię Lispu bez niektórych dodatków specyficznych dla dialektów (składnia list zapętlonych, składnia FORMAT, składnia LOOP (format i loop to tak naprawdę dwa minijęzyki, zupełne w sensie Turinga, dostępne w standardzie CL). Czy można tak opisać składnię Ruby? Nie sądzę.
Dodek: w ruby +, -, * i kilka innych to też zwykłe metody, które możemy sobie nadpisać. Przykładowo: http://wklej.org/id/17029/
Cóż – nie wiem w jaki sposób Lisp może być czytelniejszy niż Ruby, C, C++ czy cokolwiek, dla kogokolwiek. Laik patrzy i widzi niezamknięte apostrofy czy nawiasy po każdej spacji. Być może dla programisty Lisp to jest czytelne, ale na pewno nie przebije pythona, c++, czy nawet php. Bo mimo że można je nazwać bloatware, to są „ładniejsze”.
Mimo wszystko nie widzę powodu by uczyć się akurat Lisp a nie akurat Ruby – język ten nie daje mi nic, poza inną składnią, która w dodatku mi się nie podoba. Takie jest moje zdanie – obaj wiemy, że oba języki są kompletne i można w nich napisać absolutnie wszystko. Gdzieś czytałem że Lisp ma jedną wielką zaletę – prawdopodobnie za 50 lat nadal będzie używany, więc to swego czasu inwestycja. Nie twierdzę też że się go nigdy nie nauczę – po prostu Ruby można się uczyć z przyjemnością – pisze się niezwykle szybko i wygodnie, daje mi równie dużą swobodę jak Lisp i pozwala mi na różne „hacki”.
Co z tego, że w Lisp jest dopracowana składnia, którą można streścić w trzech zdaniach – on mi mimo wszystko nie pozwala pisać tak, aby mi się podobała składnia.
Zatem operatory matematyczne w Ruby są tylko cukrem syntaktycznym. W CL też masz makra readera umożliwiające infiksowość, o: http://folk.uio.no/jornv/infpre/infpre.html
Nie wiesz, bo nie korzystałeś. ‘ to makro readera rozwijane do specjalnego operatora quote – ‘(foo bar baz) == (quote (foo bar baz)) . Różnica między wartościami ewaluowanymi a cytowanymi wymaga jednak nieco szerszego opisu. Nawiasy zamykające po spacjach to oznaka bardzo złego stylu programowania, nawiasy otwierające są tak samo konieczne jak kropki w Ruby przy wywoływaniu metod.
W jaki sposób może być czytelniejszy? Masz tylko jedną składnię, wszystko jest jednolite, sama składnia jest od razu w postaci drzew składniowych, co umożliwia szybkie parsowanie… To Python nie przebije Lispu prostotą i elegancją, każdy język ze zdefiniowanymi specjalnymi strukturami jest bardziej skomplikowany niż Lisp i w gruncie rzeczy jest niemal zawsze konwertowany do drzew składniowych w procesie odczytu, czyli do postaci lispopodobnej. Po raz kolejny też przywołuję makra, czyli argument, który można zrozumieć dopiero, gdy ktoś zacznie się tego Lispu uczyć.
Nie daje Ci nic? A czytałeś, co ESR pisze o Lispie w Hacker Howto?
Co do tego, że będzie używany za 50 lat – ogólnie jest taki trend, że coraz nowsze języki są coraz bardziej podobne do Lispu, na przykład Ruby.
Co do ESR, to nie jest żaden autorytet, to krzykacz, który wszystko wie najlepiej. Jak czytałem jego książkę to szlag mnie trafiał, jak na każdym kroku, opisując „dobre” zasady programowania odwoływał się do fetchmaila. Fetchmail to, fetchmail tamto. A przy konfiguracji tego cudeńka też mnie szlag trafiał, bo musiałem instalować MTA i – z niewiadomych przyczyn – odblokować go na firewallu. O, ESR: http://dl-client.getdropbox.com/u/28596/Photo/ep013.jpg
Wiem że Lisp ma jedną, prostą i zunifikowaną składnię, ale to niestety nie znaczy że jest czytelna. Prostą składnię ma też assembler, ale to nie znaczy że jest czytelny.
I owszem – dodawanie, odejmowanie itd. to tylko cukier, „nakładka” na wywołanie obiekt.metoda. Przykładowo kod: 5.+(3) jest prawidłowy i daje spodziewany wynik – 8. Ale czy to źle, że mamy „normalne” dodawanie? Nawet jeśli to „komplikuje” język, to upraszcza pracę nam, ludziom – w szkole nas uczyli dodawać „normalnie”, a nie w odwrotnej notacji.
ps. joggerowy irc się znudził? :>