-
21. Data: 2019-08-05 14:58:49
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: g...@g...com
W dniu poniedziałek, 5 sierpnia 2019 14:35:32 UTC+2 użytkownik Roman Tyczka napisał:
> Raz spytałem, o ile pomnę to odpowiedzi nie było. Spytam jeszcze raz, dość
> na temat, skąd ksywa "panicz"?
Kiedyś kolega mnie tak przezwał, i mi zostało.
(Dlaczego tak przezwał, tego nie wyjaśnił)
Kontekst historyczny swego czasu szerzej opisałem tutaj:
https://www.quora.com/What-is-something-you-wish-you
-knew-when-you-first-started-functional-programming/
answer/Panicz-Godek
-
22. Data: 2019-08-05 22:29:33
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: Maciej Sobczak <s...@g...com>
> Rozwiązanie Haskellowe, chociaż korzysta z funkcji wbudowanych, daje jednak
możliwość zozumienia tego, co się dzieje pod spodem.
Słuszna uwaga. Ale Mathematica ma inne cele. To nie jest narzędzie dla ludzi, którzy
chcą wiedzieć, co się dzieje, tylko raczej co się stanie. Omawialiśmy to już w
okolicy open-source. Przy użyciu funkcji EditDistance Mathematica daje odpowiedź na
pytanie, jaka jest odległość między wektorami w jakiejś tam mierze.
> Prosta sprawa - zmodyfikuj rozwiązanie w Mathematice tak, żeby koszt zamiany
elementu wynosił 2 a nie 1.
Pytanie jest fair i odpowiedź (również fair) jest taka: sam sobie policz. Możesz w
Wolframie. Zaletą Wolframa jest to, że ma 5000+ gotowych odpowiedzi; nie jest jego
wadą to, że nie wszystkie (nieskończoność!) odpowiedzi są gotowe - bo w ostatecznym
porównaniu i tak jest lepiej, niż w językach, gdzie wszystko trzeba wyklepać ręcznie.
> To też jest interesujące: czy algorytm Levenshteina napisany w Mathematice będzie
działał równie szybko jak ten wbudowany?
> Czy może ten wbudowany został zaimplementowany w C?
Dobre pytanie. Nie wiemy. Co więcej, nawet gdybyśmy się dowiedzieli, to w kolejnej
wersji produktu może być inaczej. I nawet nie chodzi o język implementacji, ale
również o takie sprawy jak automatyczne wykorzystanie dostępnej równoległości albo
specjalnego sprzętu obecnego w systemie. Również w tym sensie Mathematica jest
narzędziem wysokopoziomowym.
> W każdym razie zagadka "najkrótszego kodu" w Mathematice rozwiązana.
> Każdy może wyciągnąć swoje wnioski.
Tak. Wniosek jest taki, że statystycznie w Mathematice trzeba napisać najmniej kodu.
To jest odpowiedź na zupełnie praktyczne pytanie kogoś, dla kogo komputer jest
narzędziem pracy.
> Bardziej taka analogia, że wystawiamy w wyścigu biegaczy i motocyklistów.
> Raczej nikogo nie zdziwi, że motocykliści dojadą szybciej na metę. Ale raczej nie
wnioskowałbym stąd, że kondycja motocyklistów jest lepsza.
Ale osoba zamawiająca pizzę ma gdzieś kondycję gościa, który z dumą przynosi
wystygniętego kapcia, i to jeszcze jak już wszyscy goście sobie poszli.
> Funkcja "append-map" wymaga, żeby przekazana do niej funkcja zwracała listę.
I w ten sposób zaprzeczasz swoim wcześniejszym pretensjom, że żeby coś tam zrozumieć
w Wolframie, to trzeba znać działanie jego funkcji a może nawet trzeba przeczytać
dokumentację. Z nazwy "append-map" nie wynika, że oczekuje list. Mapowanie ogólnie,
zgodnie z nazwą, mapuje elementy. A tu proszę, xyz-map oczekuje listy.
> Jeżeli masz jakieś pytania na temat mojej osobowości, to lepiej zapytaj
Nie da się. W tym zakresie nikt nie potrafi się sam zdiagnozować, muszę więc polegać
na swoich (subiektywnych) odczuciach.
> W tym kontekście, jeżeli miałbym mówić o "wyższości czegoś nad czymś", to bym
powiedział, że wkład Johna McCarthy'ego w rozwój informatyki był moim zdaniem większy
od wkładu Stephena Wolframa
Ależ nikt nie twierdzi inaczej. Ba, nawet Wolfram nie twierdzi, że ma jakikolwiek
wkład w rozwój informatyki, on się raczej eksponował w innych obszarach. Natomiast
to, że w celu ułatwienia sobie pracy w tych innych obszarach napisał program, który
potem równolegle rozwinał się jako użyteczny produkt, jest niewątpliwie osiągnięciem,
zarówno inżynierskim, jak i biznesowym.
--
Maciej Sobczak * http://www.inspirel.com
-
23. Data: 2019-08-06 10:55:03
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: Maciej Sobczak <s...@g...com>
> > Prosta sprawa - zmodyfikuj rozwiązanie w Mathematice tak, żeby koszt zamiany
elementu wynosił 2 a nie 1.
>
> Pytanie jest fair i odpowiedź (również fair) jest taka: sam sobie policz.
OK, żeby nie było, że jestem nieuprzejmy, i dla własnej zabawy, zrobiłem mały
research w tej sprawie.
Jest taka fajna funkcja:
https://reference.wolfram.com/language/ref/SequenceA
lignment.html
Ta funkcja rozpisuje różnice między sekwencjami, z czego można wyciągnąć poszczególne
operacje (usunięcie, wstawienie, zamiana). Jeżeli dobrze zrozumiałem ćwiczenie, to
rozwiązeniem może być takie coś:
myDistance[s1_, s2_] := Total[
Min[#] + Max[#] & /@
Cases[SequenceAlignment[s1, s2], a_List :> StringLength /@ a]
]
Pozwoliłem sobie użyć skróconych (idiomatycznych) zapisów na podstawowe operacje
mapowania i lambdy - skoro w innych językach są śmieszne znaczki, to ja też
skorzystam.
Wyrażenie Min+Max załatwia podwójne zliczenie zamian w porównaniu do
wstawień/usunięć. Pełne wyrażenie dla dowolnych wag to:
replacementCost*Min[#] + deletionCost*(Max[#] - Min[#])
gdzie # to anonimowa para {del, ins}, gdzie del to ilość znaków do usunięcia a ins to
ilość znaków do wstawienia; jeśli obie są niezerowe, to znaczy, że jest zastąpienie,
więc np. para {3,5} oznacza, że są 3 znaki do zastąpienia i 2 do
usunięcia/wstawienia. Wszystkie takie wartości są sumowane.
Czy to jest prawidłowy sposób liczenia - nie wiem, ale tak to zrozumiałem.
Czyli nadal nie wyszło jakoś dramatycznie dużo tego kodu, prawda?
Nadal jednak szukałbym gotowych implementacji tutaj (choćby po to, żeby skorzystać z
optymalizacji, które ktoś zrobił za mnie):
https://reference.wolfram.com/language/guide/Distanc
eAndSimilarityMeasures.html
I właśnie na tym polega użyteczność tego produktu.
--
Maciej Sobczak * http://www.inspirel.com
-
24. Data: 2019-08-06 15:31:48
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: Borneq <b...@a...hidden.p>
W dniu 30.07.2019 o 15:58, g...@g...com pisze:
> Hej,
> gdyby ktoś był zainteresowany, to ostatnio opublikowałem na Quorze nieco
przydługawy artykuł (czy może raczej "małą książkę"?) objaśniający technikę Friedmana
i Byrda "uruchamiania ewaluatora od tyłu".
>
> https://www.quora.com/Can-you-explain-to-non-coders-
the-most-impressive-code-youve-seen/answer/Panicz-Go
dek
>
> W ogólności pytanie "jaki jest najbardziej imponujący kod, jaki widziałeś" wydaje
mi się ciekawe, więc jeśli ktoś tu ma jakieś swoje obserwacje na ten temat, z chęcią
bym się dowiedział.
>
> Pozdrawiam
>
Daję namiar:
https://scholarworks.iu.edu/dspace/bitstream/handle/
2022/8777/Byrd_indiana_0093A_10344.pdf
"Relational Programming in miniKanren:Techniques, Applications,
andImplementations"
-
25. Data: 2019-08-06 15:45:59
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: g...@g...com
W dniu wtorek, 6 sierpnia 2019 15:32:26 UTC+2 użytkownik Borneq napisał:
> > gdyby ktoś był zainteresowany, to ostatnio opublikowałem na Quorze nieco
przydługawy artykuł (czy może raczej "małą książkę"?) objaśniający technikę Friedmana
i Byrda "uruchamiania ewaluatora od tyłu".
> >
> > https://www.quora.com/Can-you-explain-to-non-coders-
the-most-impressive-code-youve-seen/answer/Panicz-Go
dek
> >
> > W ogólności pytanie "jaki jest najbardziej imponujący kod, jaki widziałeś" wydaje
mi się ciekawe, więc jeśli ktoś tu ma jakieś swoje obserwacje na ten temat, z chęcią
bym się dowiedział.
> >
> > Pozdrawiam
> >
> Daję namiar:
> https://scholarworks.iu.edu/dspace/bitstream/handle/
2022/8777/Byrd_indiana_0093A_10344.pdf
>
> "Relational Programming in miniKanren:Techniques, Applications,
> andImplementations"
Posiłkowałem się tym, zwłaszcza przy obsłudze więzów.
Inne źródło to artykuł Friedmanna i Hemanna o minimalistycznej wersji minikanrena
zwanej "microkanren" (albo uKanren):
http://webyrd.net/scheme-2013/papers/HemannMuKanren2
013.pdf
Ale jeśli ktoś ma za małą motywację do czytania, to jest też film warsztatowy:
https://www.youtube.com/watch?v=0FwIwewHC3o
Przyznam też, że pomocna była dla mnie lektura źródeł microkanrena w Haskellu (dzięki
systemowi typów rozumiało mi się to dużo lepiej, niż implementację w Scheme):
https://gist.github.com/msullivan/4223fd47991acbe045
ec
ale moja implementacja różni się na kilka istotnych sposobów od miniKanrena, bo
mieliśmy inne priorytety - im zależało na przenośności i integrowalności ich języka w
różnych środowiskach (i w pewnej mierze na wydajności), a mnie na czytelności języka
i łatwości prezentacji
-
26. Data: 2019-08-06 16:32:02
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: Borneq <b...@a...hidden.p>
W dniu 06.08.2019 o 15:45, g...@g...com pisze:
> Przyznam też, że pomocna była dla mnie lektura źródeł microkanrena w Haskellu
(dzięki systemowi typów rozumiało mi się to dużo lepiej, niż implementację w Scheme):
> https://gist.github.com/msullivan/4223fd47991acbe045
ec
Co to znaczy microkanren w Haskellu?
Czy ten mały program to interpreter w Haskellu składni schemapodobnej
microkanrena czy też rozszerzenie Haskella i microkanren ma tu składnię
haskelopoodbną?
-
27. Data: 2019-08-06 16:39:36
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: g...@g...com
W dniu wtorek, 6 sierpnia 2019 16:32:17 UTC+2 użytkownik Borneq napisał:
> > Przyznam też, że pomocna była dla mnie lektura źródeł microkanrena w Haskellu
(dzięki systemowi typów rozumiało mi się to dużo lepiej, niż implementację w Scheme):
> > https://gist.github.com/msullivan/4223fd47991acbe045
ec
>
> Co to znaczy microkanren w Haskellu?
> Czy ten mały program to interpreter w Haskellu składni schemapodobnej
> microkanrena czy też rozszerzenie Haskella i microkanren ma tu składnię
> haskelopoodbną?
Tzn. ma składnię wywiedzioną z Haskella (nie tyle "Haskellopodobną", tylko taką, na
jaką Haskell naturalnie pozwala swoimi konstruktorami typów i funkcji anonimowych)
na dole wklejonego powyżej linka jest kilka przykładów wyrażeń w Haskellowym
microKanrenie.
MiniKanren jako taki nie ma swojej składni, jego składnia jest z założenia
"pasożytnicza" na składni goszczącego języka.
Różne implementacje języków *Kanren można znaleźć tutaj:
http://minikanren.org/
Jak byś sobie chciał zobaczyć jak to wygląda np. w JavaScripcie, to tutaj masz
przykłady:
https://github.com/tca/veneer/blob/master/mk_test.js
-
28. Data: 2019-08-06 16:57:16
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: Borneq <b...@a...hidden.p>
W dniu 06.08.2019 o 16:39, g...@g...com pisze:
> MiniKanren jako taki nie ma swojej składni, jego składnia jest z założenia
"pasożytnicza" na składni goszczącego języka.
>
> Różne implementacje języków *Kanren można znaleźć tutaj:
> http://minikanren.org/
To świetnie, widzę że nawet język nie musi być funkcyjny. Widzę Javę i
Rust (co prawda nie ma C++, ale to chyba z braku odśmiecania pamięci)
Najbardziej znam Javę, więc w wolnym czasie przyjrzę się:
https://github.com/nd/mk.java
i
https://github.com/heidisu/java8kanren
-
29. Data: 2019-08-06 17:01:42
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: Borneq <b...@a...hidden.p>
W dniu 06.08.2019 o 16:39, g...@g...com pisze:
> Jak byś sobie chciał zobaczyć jak to wygląda np. w JavaScripcie, to tutaj masz
przykłady:
> https://github.com/tca/veneer/blob/master/mk_test.js
>
A tu widzę w przeglądarce
http://tca.github.io/veneer/examples/editor.html
ale składnia wydaje mi się że przypomina kanren w schemie a nie JavaScript
-
30. Data: 2019-08-06 17:20:14
Temat: Re: "Najbardziej imponujący kod, jaki widziałem"
Od: g...@g...com
W dniu wtorek, 6 sierpnia 2019 16:57:18 UTC+2 użytkownik Borneq napisał:
> > MiniKanren jako taki nie ma swojej składni, jego składnia jest z założenia
"pasożytnicza" na składni goszczącego języka.
> >
> > Różne implementacje języków *Kanren można znaleźć tutaj:
> > http://minikanren.org/
>
> To świetnie, widzę że nawet język nie musi być funkcyjny. Widzę Javę i
> Rust (co prawda nie ma C++, ale to chyba z braku odśmiecania pamięci)
W Rust też chyba nie ma odśmiecania pamięci.
Podejrzewam, że odkąd w C++ są lambdy, powinno się w nim bez problemu dać
zaimplementować jakiegoś miniKanrena (a w najgorszym razie można po prostu alokować
pamięć i jej nie zwracać)