Ucząc się nowego języka programowania czasami natrafiasz na funkcję językową, która sprawia, że żałujesz, że nie znasz go w innych językach programowania, które znasz.
Jakie są niektóre funkcje językowe, które były w czasie nauki dla Ciebie bardzo nowe i które chciałbyś, aby posiadały inne języki programowania.
Przykładem tego są generatory w języku Python lub C #. Inne przykłady mogą obejmować rozumienie list w Pythonie, szablon w C ++ lub LINQ w .NET lub leniwe ocenianie w Haskell.
Jakie inne na wpół unikalne cechy językowe, z którymi się spotkałeś, były dla Ciebie zupełnie nowe i pouczające? Czy są inne cechy starszych języków programowania, które były wyjątkowe i wyszły z mody?
źródło
Makra Lisp.
Językiem makro Lisp jest Lisp, z kilkoma predefiniowanymi funkcjami składni dla wygody. Korzystając z nich, można dodawać do języka najważniejsze funkcje, takie jak wybór stylów orientacji obiektów lub dopasowanie deterministyczne przypominające Prolog, bez patrzenia na miejsce. Umożliwia to
setf
makro, które jest koncepcyjnie bardzo silnym makro:(setf A B)
oznacza, że kiedy oceniszA
, dostanieszB
, i które można rozszerzyć do dowolnego limitu, który ci się podoba.Metaprogramowanie szablonów w C ++ jest zdolne do podobnych rzeczy, ale w znacznie innym języku niż w zwykłym C ++.
źródło
Dekorator Pythona.
Za pomocą dekoratora niezwykle łatwo jest zaimplementować zapamiętywanie lub synchronizację funkcji.
Przykład timera funkcji.
Teraz, jeśli masz funkcję foo, którą chcesz poświęcić czas, możesz po prostu to zrobić,
Zobaczysz coś takiego,
Funkcja „foo” zajęła 3 sekundy.
źródło
Przesyłanie do
void*
C. Możesz rzutować wszystko na surowe bajty i robić, co chcesz z tymi danymi.(Tak, obecnie jest wyjątkowy ...)
źródło
void*
...Pointer
Pascala i Object Pascal robi to samo.int64_t
którego nie zawsze możesz bezpiecznie przesyłaćvoid *
(Przepraszam za późne - 2 lata - odpowiedź).Wydajność w Pythonie
W Pythonie (i wierzę w C #) możesz zdefiniować tak zwany generator, który wstrzymuje wykonywanie funkcji w
yield
instrukcji, zwraca wartość i przy kolejnych wywołaniach, restartuje funkcję od momentu jej przerwania (z zachowaniem stanu między wywołaniami). Jest to doskonałe do generowania długich list wartości, w których interesuje Cię tylko bieżąca wartość funkcji (co jest bardzo powszechne). Pozwala budować potencjalnie nieskończenie długie sekwencje, zajmując jedynie bardzo ograniczoną przestrzeń w pamięci.źródło
Wyrażenia lambda (zamknięcia, funkcje zagnieżdżone, metody anonimowe, jakkolwiek je nazwiesz).
Po raz pierwszy spotkałem ich w Perlu, od razu je pokochałem i zastanawiałem się, dlaczego inne języki ich nie mają. Wydaje mi się, że obecnie nie jest już tak wyjątkowy; nawet PHP udało się je w jakiś sposób zhakować. Ale wtedy były na wpół wyjątkowe.
źródło
Kontynuacje ze schematu (później przyjęte przez kilka innych języków, w tym Ruby).
źródło
Zestawy w Delphi są bardzo przydatne, właściwie tylko nazwana tablica boolowska. Są bardzo przydatne do zapisywania formularza ustawień z 32 polami wyboru. Ale mają wszystkie te same funkcje teorii mnogości (tj. Różnicę, przecięcie, połączenie).
Nie jestem pewien, czy wypadły z mody, ale używam ich cały czas.
źródło
Wysłać
Z Erlang. Wysyła wiadomość asynchroniczną do innego wątku.
Otrzymać
Z Erlang. Odbiera wiadomość z innego wątku.
źródło
Właściwości C #
vs
(Jawa)
źródło
Związki w C
Nie mogę szczerze powiedzieć, że sam nie napisałem wystarczająco dużo C, aby zrobić którykolwiek z nich, ale pracowałem z kodem innego, który to robi.
Jeśli chodzi o pakowanie mieszanin różnych danych w aplikacjach, które manipulują nieprzetworzonymi bitami / bajtami, takimi jak sieć lub przechowywanie danych binarnych. W silnie pisanych językach nie ma łatwego sposobu na zrobienie tego.
Zrzeczenie się:
Chociaż związki są bardzo przydatne w niektórych przypadkach, nie można ich znaleźć w większości języków wyższego poziomu, ponieważ nie są bezpieczne pod względem typu. IE, możesz sprawić, by dane przeciekły przez granice zmiennych przy użyciu związków (duże nie, nie w świecie bezpiecznym dla typu). Z dużą mocą przychodzi duża odpowiedzialność.
źródło
union
użycia jest bezpieczna, niektóre są dobrze obsługiwanymi idiomami (chociaż technicznie niepoprawne) - patrz cellperformance.beyond3d.com/articles/2006/06/… (chociaż jest więcej poblem ze wskazówkami związki mogą to sfałszować).record
składnię o obsługę związków:in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
Naprawdę podoba mi się modyfikator chyba, że w Ruby . Wydaje się to takie naturalne i zastępuje wiele scenariuszy, w których Twój kod wydaje się bez niego bardzo nieporządny.
Jak możesz tego nie lubić? :RE
źródło
unless
iwhen
zastępują najczęstsze scenariusze rozgałęziania, które tradycyjnie by się używałyif/else
.fantazyjne składnie argumentów python
Nie jestem pewien, jak wyjątkowe jest to, ale w Pythonie możesz robić fajne rzeczy, takie jak automatyczne ustawianie par słów kluczowych w słowniku i odwrotnie. To samo z listami:
python docs (przewiń w dół, aby uzyskać więcej argumentów przekazujących)
źródło
Preprocesor C. Możesz nawet pisać wspólny kod na różnych platformach za pomocą - mniej lub więcej - ifdefs.
źródło
Kategorie celu C
Kategorie oferują łatwy sposób na rozszerzenie funkcjonalności obiektu w czasie wykonywania (myśl kompozycja kontra dziedziczenie). Klasycznym przykładem jest dodanie modułu sprawdzania pisowni do klasy NSString.
Przydatny również w przypadku drobnych poprawek, ponieważ implementacja metody kategorii zastąpi jej implementację nadrzędną.
źródło
Ruby „s inject metoda w połączeniu z symbolem # to_proc cechą Ruby 1.9 pozwala napisać kilka niezwykle zwięzły (ale nadal czytelny) Kod:
na przykład
(1..10).inject(:+)
która sumuje liczby całkowite od 1 do 10 => 55
Takie przykłady sprawiły, że chciałem nauczyć się Ruby, co właśnie zacząłem.
źródło
Mechanizm wiązania w JavaFX (RIP). Wiążą słów kluczowych pozwala powiązać wartość zmiennej wartości wyrażenia i coraz Państwo pozbyć się wszystkich tych brzydki Listener ogóle standardowy kod.
Podczas gdy JavaFX pod wieloma względami był dość nieudany, wiele funkcji języka skryptowego okazało się całkiem przyjemnych.
źródło
Mixiny łańcuchowe oraz ocena funkcji czasu kompilacji w D to całkiem wyjątkowa funkcja zabójcy. Tak, technicznie rzecz biorąc, są to dwie cechy, ale prawdziwa moc pochodzi z ich połączenia. Dzięki tej kombinacji możesz pisać zwykłe funkcje D, które generują kod w postaci łańcucha w czasie kompilacji, a następnie mieszać ten kod w dowolnym zakresie i poddać go ocenie jako zwykły kod D. Kod jest w pełni skompilowany statycznie i działa dokładnie tak, jakby został napisany ręcznie. Ta funkcja jest nawet używana do obejścia kilku lepkich sytuacji w standardowej bibliotece.
źródło