Czego powinienem się nauczyć ze schematu?

10

Zastanawiałem się, jakich unikalnych funkcji mogę się nauczyć ze schematu, które pomogłyby mi zostać lepszym programistą?

Mam duże doświadczenie w językach głównych i chcę poszerzyć swoje horyzonty i dowiedzieć się o aspektach funkcjonalnych, których brakuje w innych językach. Znam zamknięcia z javascript, wyrażenia lambda z C # i zastanawiałem się, na czym mogę się skupić, czego brakuje w innych językach? Oprócz składni Lisp, czuję się tak, jak do tej pory widziałem w innych językach.

Co jest wyjątkowego w Scheme / Lisp, które nauczy mnie czegoś nowego?

bunglestink
źródło
3
Lisp jest warte nauki dla głębokiego doświadczenia oświecenia, które będziesz mieć, kiedy w końcu je zdobędziesz; to doświadczenie sprawi, że będziesz lepszym programistą do końca swoich dni, nawet jeśli nigdy tak naprawdę nie używasz Lisp. - Eric Raymond
Robert Harvey
1
Również: xkcd.com/297
Robert Harvey
1
@Robert Harvery: Także: xkcd.com/224
Poindexter
2
W obecnej formie to pytanie nie jest szczególnie konstruktywne. Jeśli możesz go przerobić, aby poprosić o bardziej szczegółowe informacje, może to być przydatne.
ChrisF
Zobacz także Nauczanie języków programowania w epoce post-linnejskiej oraz podręcznik, do którego odwołuje się ten dokument: Języki programowania: Aplikacja i interpretacja , w których używany jest język rakiety , dialekt schematu.
Robert Harvey

Odpowiedzi:

7

Być może najważniejszą cechą definiującą Lisp jest „Kod jako dane”.  Nie dostaniesz tego doświadczenia w zupełnie inny sposób w żadnym innym języku. W języku C # najbliższym analogiem są drzewa wyrażeń.

Właśnie ta jakość sprawia, że ​​Lisp jest doskonałym językiem do analizy. Właśnie ta cecha skłoniła Paula Grahama do powiedzenia o Lisp: „Niezwykłą rzeczą w Lisp - w rzeczywistości decydującą cechą Lisp - jest to, że można go napisać sam w sobie”. Chociaż kompilatory samo-hostujące nie są niczym nowym, żaden język nie robi tego tak elegancko jak Lisp.

Metaprogramowanie (coś, w czym Lisp także się wyróżnia) jest również warte nauki.

Beating the Averages Paula Grahama
http://www.paulgraham.com/avg.html

Robert Harvey
źródło
1
Myślę, że powodem, dla którego nigdy nie miałem tego „aha!” moment, który obiecał mi ESR, to to, że miałem już objawienie „kod jako dane” w Prologu.
Frank Shearar
1
Czy Haskell ma atrybut „kod jako dane”? Czy piękno zależy w dużej mierze od dynamicznego pisania i refleksji?
Joey Adams
1
@Joey: Myślę, że fakt istnienia szablonu Haskell oznacza, że ​​Haskellowi brakuje atrybutu „kod jako dane”.
j_random_hacker
4

Tak, pomoże ci myśleć w sposób rekurencyjny. Studiowałem go (schemat) tylko przez około miesiąc w klasie języka programowania i pomogło mi to rozwinąć sposób myślenia i rozwiązywania problemów programistycznych.

Zawsze warto wypróbować inne paradygmaty programowania; następnie wrócisz odświeżony do świata OO z nowymi pomysłami.

Nie składnia, ale rozumowanie, to świetne ćwiczenie mózgu. Oprócz rekurencji i ciekawego korzystania z list, nie ma wiele więcej IMHO, ale warto.

dukeofgaming
źródło
Nie jest unikalny w schemacie. Każdy (dobrze, prawie każdy) język funkcjonalny jest odpowiedni do wykonywania rekurencji.
Zgadzam się, ale OP wydaje się zainteresowany programem w porównaniu z językami „głównego nurtu” ....
Xavier Nodet
1

Kontynuacja :

W informatyce i programowaniu kontynuacja jest abstrakcyjnym przedstawieniem stanu kontroli programu komputerowego. Kontynuacja weryfikuje stan kontroli programu, tzn. Kontynuacja jest strukturą danych, która reprezentuje proces obliczeniowy w danym punkcie wykonywania procesu; do utworzonej struktury danych można uzyskać dostęp za pomocą języka programowania, zamiast ukrywać się w środowisku wykonawczym. Zawiera informacje, takie jak „aktualny stos procesu (w tym wszystkie dane, których czas życia mieści się w procesie, np.„ Zmienne lokalne ”), a także punkt obliczeniowy procesu. Instancja kontynuacji może być później wykorzystana jako struktura kontrolna; po wywołaniu wznowi wykonywanie z punktu kontrolnego, który reprezentuje. „Obecna kontynuacja”

a następnie spróbuj wdrożyć Niejednoznaczny operator McCarthy'ego :

W 1963 roku John McCarthy, wynalazca Lisp, opublikował artykuł A Basis for a Mathematical Theory of Computation, w którym zaproponował funkcję (w znaczeniu programu komputerowego) amb (.,.). Chodzi o to, że amb (x, y) jest najpierw równy x. Ale jeśli później w obliczeniach okaże się, że prowadzi to do jakiejś sprzeczności, wartość x jest cofana i zastępowana przez y. Jest to znacznie bardziej złożony biznes, niż może się początkowo wydawać. Cofanie wartości zasadniczo oznacza zawrócenie całego stanu obliczeń do miejsca, w którym było, gdy amb zwrócił wartość x, a następnie przesunięcie wartości y. Oznacza to, że w jakiś sposób zamraża i kopiuje cały stan, gdy x zostało zwrócone po raz pierwszy. Po znalezieniu sprzeczności cały stan programu jest odrzucany i zastępowany zamrożoną wersją, która jest reaktywowana. Te zamrożone stany są znane jako kontynuacje. Pod wieloma względami przypomina to oświadczenie GOTO dotyczące kwasu. Może to spowodować przeskok do dowolnego miejsca w kodzie. Ale kontynuacje są ładniejsze niż GOTO, ponieważ są bardziej podatne na logiczne rozumowanie.

knivil
źródło
1

Mogę myśleć o następujących kwestiach:

  • Prawdziwe makra (wykorzystujące pełną moc języka do generowania kodu)
  • Homoiconicity (dane jako kod, kod jako dane)
  • Leniwa ocena
  • Kontynuacje

Myślę też, że języki seplenienia powinny być niesamowite do definiowania języków specyficznych dla domeny (DSL). Warto o tym przeczytać, jeśli jeszcze o tym nie wiesz.

Joanis
źródło