Katil yarı benzersiz programlama dili özellikleri [kapalı]


25

Yeni bir programlama dili öğrenirken, bazen bildiğiniz diğer programlama dillerinde de olmanızı dileyen bir dil özelliği ile karşılaşırsınız.

Sizin için çok yeni öğrenilen ve diğer programlama dillerinin de olmasını istediğiniz bazı dil özellikleri nelerdir?

Buna bir örnek Python veya C # 'daki üreticilerdir . Diğer örnekler Python'daki liste kavramalarını, C ++ 'da şablonunu veya .NET'te LINQ'yi veya Haskell'de tembel değerlendirmeyi içerebilir.

Tamamen yeni ve sizi aydınlatan başka hangi yarı benzersiz dil özelliklerine rastladınız? Eski programlama dillerinin kendine özgü ve modası geçmiş başka özellikleri var mı?

Yanıtlar:


25

Haskell'de pratik olarak her şey

  • Monads. Evet - ayrıştırıcı, GÇ, Listelerdeki işlemler ve diğer şeyleri çok kolaylaştıran büyük korkutucu kelime (ortak düzeni fark ettiğinizde)
  • Oklar. Gelişmiş kullanıcılar için aynı;)
  • Lambdas vb gibi standart şeyler
  • Kurutma fonksiyonları
  • Cebirsel veri tipleri
  • Desen eşleştirme

Ve daha fazlası.

PS. Evet. Kimse sorsa Haskell hayranıyım.


12
Adil olmak gerekirse, bu listenin çoğu için ML kredisi vermelisiniz.
munificent

1
Peki - monad ve oklar IIRC hariç. Ama yine de yarı benzersizler
Maciej

Aşağı oy için herhangi bir özel sebep var mı?
Maciej Piechotka

2
Desen eşlemesi için +1. Bunu diğer insanlara gösteriyorum ve anlamıyorlar. Bence bu bir dahi.
Barry Brown,

Zorunlu ( steve-yegge.blogspot.com/2010/12/… ). BTW, lambdaları eşsiz bulmayı düşünmüyorum, python, C #, javascript, vb. Diğer birçok dil onu zincirleme olarak adlandırır; jquery çekirdeği esasen büyük bir HTML / DOM ve AJAX monad setidir (Google: jQuery.fn). Körleme günümüzde nispeten yaygındır.
Evan Plaice

21

Lisp makroları.

Lisp makro dili, kolaylık uğruna önceden tanımlanmış birkaç sözdizimi özelliğine sahip Lisp'tir. Bunları kullanarak, herhangi bir nesne yönlendirme stili ya da Prolog benzeri deterministik eşleşme gibi, dile bakmadan diline temel özellikler eklemek mümkündür. Bu yapar setf: Bir kavramsal çok güçlü makro olan makro mümkün (setf A B)değerlendirdiğinizde, bu araçlar Asizi alacak Bve bunun gibi herhangi bir limitin sen kadar uzatılabilir.

C ++ şablonunda metaprogramlama benzer şeyler yapabilir, ancak normal C ++ 'dan çok farklı bir dildedir.


+1 Bir gün Lisp lehçesinde programlayabileceğimi umuyorum.
Oliver Weiler

@Helper ... C ++ şablonları ile [korkunç kahkaha]
mlvljr 21:10

@mlvjr: Sen korkunçsun.
David Thornley

Aslında, öyle sadece Hiç bir dille gerekecektir dışı-box özelliği. Lisp makroları ile diğer tüm olası özellikleri daha sonra ekleyebilirsiniz.
SK-mantık

18

Python'un dekoratörü.

Dekoratör kullanarak notlama veya fonksiyon zamanlamasını uygulamak son derece kolaydır.

Bir fonksiyon zamanlayıcı örneği.

class FuncTimer(object):
    """ Time how much time a function takes """
    def __init__(self, fn):
        self.fn = fn
        self.memo = {}
        self.start_time = time.time()
    def __call__(self, *args):
        self.memo['return'] = self.fn(*args)
        print("Function '%s' took %u seconds" % (self.fn.__name__, time.time() - self.start_time))
        return self.memo['return']

Şimdi zamana koymak istediğiniz bir fonksiyonunuz varsa, bunu basitçe yapabilirsiniz.

@FuncTimer
def foo():
    # foo's implememtation goes here

Gibi bir şey göreceksiniz

'Foo' işlevi 3 saniye sürdü.


Java'nın benzer bir amacı ve sözdizimi olan ek açıklamaları vardır, ancak çok farklı çalışır
Casebash

1
+1: Python'un dekoratörleri beni dildeki neredeyse tüm özelliklerden daha fazla etkiledi. Çok güzeller ve basitler!
Adam Paynter

Belki bizimle basit bir örnek paylaşabilirsiniz? Python'un dürüst olduğunu bilmiyorum.
ShdNx

@ShdNx, az önce bir örnek ekledim.
grokus

1
Başlangıç ​​zamanı aramanın bir parçası olarak hesaplanmamalı mı?
12'de

14

Yayın yapılan void*C. You ham bayt için her şeyi döküm ve yapabileceği ne istersen bu verilerle.

(Evet, günümüzde bu kadar benzersiz ...)


1
.NET dillerinde nesne çok benzer. Sadece daha fazla güvenli tip vs.
Maciej Piechotka

Nesneye birçok dilde yayın yapabilirsiniz. Asıl sorun, birçok dilin ilkelleri ve nesneleri
ayırmasıdır

5
@ Maciej: .NET'te bile, gerçekten ilkelleri Object'e koyamazsınız. Sen kutusu onları ve oldukça farklı bir canavar. Ayrıca, oyuncu seçimi yapmaktan tamamen farklı void*...
Dean Harding

1
Yayın yapılan PointerPascal ve Object Pascal aynı şeyi yapar.
Frank Shearar

1
@DeanHarding: Şey - C'ye int64_ther zaman güvenle kullanamadığın bir şeye sahipsin void *(Üzgünüm - geç 2 yıl - cevap).
Maciej Piechotka

12

Python'da Verim

Python'da (ve ben C # 'a inanıyorum), bir yieldifadede işlev yürütmeyi duraklatan , değeri döndüren ve sonraki aramalarda, bıraktığı işlevi yeniden başlatan (çağrılar arasında korunan durum ile) bir jeneratör tanımlayabilirsiniz . Bu, yalnızca işlevin şu anki değeriyle (çok yaygın) ilgilendiğiniz uzun değer listeleri oluşturmak için harikadır. Bellekte yalnızca çok sınırlı yer kaplarken potansiyel olarak sonsuz uzun diziler oluşturmanıza olanak sağlar.


1
Verim zaten soruda listelenmiştir.
Trinidad,

Bu, BCPL'ye kadar uzanıyor.
Peter Taylor

8

Lambda ifadeleri (kapaklar, iç içe geçmiş fonksiyonlar, adsız yöntemler, ne şekilde adlandırsanız).

İlk önce Perl'de karşılaştım, anında sevdim ve neden diğer dillerin olmadığını merak ettim. Bugünlerde artık o kadar eşsiz olmadığını tahmin ediyorum; PHP bile bir şekilde onları hack başardı. Ama o zamanlar yarı eşsizdiler.


5
Eşsiz, etrafındaki ikinci en eski programlama dili olan Lisp'e geri döndüğünüz sürece. ;-)
Michael H.

-1: Yarı benzersiz değil
Casebash


7

Delphi'deki kümeler oldukça kullanışlıdır, hemen hemen sadece adlandırılmış bir boolean dizisidir. 32 onay kutusuyla bir ayar formunu kaydetmek için çok kullanışlıdır. Fakat hepsi aynı set teorik fonksiyonlara sahipler (yani fark, kesişme, sendika).

Modalarından düşüp düşmediklerinden emin değilim, ama ben onları her zaman kullanırım.


Güzel, ama bu Java'da uygulanması kolay olmaz mıydı, örneğin: boolean []?
Mark C

Evet, yapabilirsiniz, ancak bunun kadar öz olduğunu sanmıyorum: TForm = (FF_1500 = 1, FF_CA251 = 5, FF_UB04 = 6, FF_MA10 = 7); TFormSet = TForm kümesi;
Peter Turner

7

Gönder

Erlang’dan. Başka bir iş parçacığına eşzamansız bir ileti gönderir .

Expr1 ! Expr2

Teslim almak

Erlang’dan. Başka bir diziden mesaj alır.

receive
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
end

5

C # Özellikleri

/// <summary>
/// Get ID
/// </summary>
public int ID
{
    get; set;
}

vs

(Java)

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

2
Evet, onlar daha iyi, ama bu kötü bir örnek. Alıcı / ayarlayıcı gerçekten özel bir şey yaparsa ve C # sürümü daha az belgelenirse, fark çok daha küçük olacaktır.
Bart van Heukelom 11:10

1
Patronum C # 'in otomatik özelliklerine şiddetle karşı çıkıyor ve ne zaman bir tartışmamız olursa, hiçbirimiz diğerinin neden doğru veya yanlış olduğunu göremiyoruz. Ben sadece onları seviyorum çünkü kodu çok daha temiz hale getiriyorlar ve uzun vadede bana zaman kazandırıyorlar.
mbillard

2
Bunun, insanları her yerde alıcılar ve raportörlere teşvik etmesine izin verme. Sadece bir nesne üzerinde eylem olarak mantıklı olan alıcılar ve ayarlayıcılar kullanılmalıdır.
David Thornley

3
Onlar C # özellikleri olarak adlandırılmaz, Otomatik özellikleri olarak adlandırılırlar
Jaco Pretorius

1
Otomatik özellikler bugünlerde çok yaygındır. Python, Objective-C ...
Casebash

5

C'deki sendikalar

Dürüstçe söyleyemem, bunlardan herhangi birini yapacak kadar C yazamadım ama diğerlerinin koduyla çalıştım.

Ağ oluşturma veya ikili veri depolama gibi ham bit / baytları işleyen uygulamalarda farklı verilerin karışımlarını paketlemeye gelince. Kesinlikle yazılan dillerde eşdeğeri yapmanın kolay bir yolu yoktur.

Yasal Uyarı:

Sendikalar bazı durumlarda son derece yararlı olsalar da, çoğu dilde bulunmazlar çünkü güvenli değildirler. IE, sendikaları kullanarak değişkenlerin sınırlarını aşan verileri yapabilirsiniz (tür güvenli dünyada büyük bir hayır). Büyük güç büyük sorumluluk getirir.


2
IMHO iyi bir sebepten dolayı. Verileri yeniden yorumlamak, kendisini yaya olarak çekmenin güzel bir yoludur ( en.wikipedia.org/wiki/Aliasing_(computing) ). Açık dönüşümleri daha iyi kullanmak IMHO. Doğru yolda olan sendikalar IMHO cebirsel veri türleridir.
Maciej Piechotka 12:10

@ Maciej Gerekli bir feragatname ekledim. Bununla birlikte, sendikaları kullanmanın tehlikelerini tam olarak açıklayıp açıklamadığından emin değilim, çünkü onları kullanma konusunda gerçekten kesin bir bilgiye sahip değilim. Sadece onları kullandıklarını gördüğümde, kodun üst seviye dil eşdeğerinden çok daha özlü ve daha kolay olduğunu biliyorum.
Evan Plaice

Sorun, C'nin 'yüksek seviye dil' olmasıdır (sadece düşük seviye yüksek seviye dil). K & R C'den beri daha hızlı taşınabilir kod kullanmanıza izin veren birçok kural alır. Fiyat, derleyicinin çeşitli şeyleri üstlenebileceği ve bazılarının kafasının karışabileceği yönündedir. ÇOK unionbakınız - kullanım bazı iyi (teknik olarak doğru olmasa da) deyimleri desteklenmektedir, güvenlidir cellperformance.beyond3d.com/articles/2006/06/... (o işaretçileri sendikalarıyla daha Probleme can iyice sahte öyle rağmen).
Maciej Piechotka

Delphi onun genişletilmiş record: Destek sendikalara sözdizimiin_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
Frank Shearar

5

Ruby'de değiştirici olmadığı sürece gerçekten hoşuma gidiyor . Çok doğal görünüyor ve kodunuzun onsuz çok dağınık göründüğü pek çok senaryoyu değiştiriyor.

puts "All good" unless input.nil?

Bundan nasıl hoşlanmıyorsun? : D


6
Perl Ruby'den önce aldı. Onu ben de seviyorum.
Barry Brown

1
Nemerle için benzer anahtar kelimeleri vardır unlessve whenhangi geleneksel olarak kullanacağı senaryoları dallanma en yaygın yerini if/else.
MattDavey

5

fantezi python argümanı sözdizimleri

Bunun ne kadar benzersiz olduğundan emin değilim, ancak python'da, anahtar kelime çiftlerinin otomatik olarak bir sözlük haline getirip geri alması gibi harika şeyler yapabilirsiniz. Listelerle aynı:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"


parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')

python docs (daha fazla argüman geçişi için aşağı kaydırın)


1
+1, listedeki tüm parametreleri, isteğe bağlı tüm parametreler için önceden değer girmek zorunda kalmadan geçirebilmek için.
eswald

4

C önişlemcisi. Daha az veya daha fazla ifdef ile farklı platformlara ortak kod bile yazabilirsiniz.


2
Kendi ek adımlarını alan ve tüm dillerle çalışan daha iyi önişleyiciler mevcut.
David Thornley

İfdef, ifndef ve diğerleri ile oldukça mutluyum.
ern0

3

Amaç-C Kategorileri

Kategoriler, bir nesnenin çalışma zamanındaki işlevselliğini genişletmek için kolay bir yol sunar (kalıtımla ilgili kompozisyonu düşünün). Klasik örnek, NSString sınıfına bir yazım denetleyici eklemektir.

@interface NSString (SpellChecker)
- (BOOL) checkSpelling;
@end

Aynı zamanda, düşük etkili hata düzeltmeleri için de yararlıdır, çünkü bir kategorinin bir yöntemi uygulamasının ebeveynlerin uygulanmasını geçersiz kılacağından.


1
C # uzantısı yöntemleri çok benzer
Casebash

2

Ruby 'nin iğne ile kombine yöntem Sembol # to_proc Ruby 1.9 özelliği bir yazma bazı inanılmaz özlü (ama yine de okunabilir) kodu sağlar:

Örneğin (1..10).inject(:+)

bu 1 ile 10 arasındaki tamsayıları toplar => 55

Bunun gibi örnekleri görmek, daha yeni yapmaya başladığım Ruby'yi öğrenmek istememi sağladı.


9
Adil olmak gerekirse, enjekte Ruby'nin Lisp, Haskell, vb. Gibi dillerden fold / foldl / foldr'ın katlamasıdır
mipadi

Buna gerçekten benzersiz demezdim.
Daenyth

1
Sorunun başlığı benzersiz değil, "yarı benzersiz" diyor. Kuşkusuz, enjekte etme (veya harita vb.) Ve Symbol # to_proc kombinasyonunun sağladığı kodun özü, C, Java ve C ++ gibi ana dillerin ötesinde bir yoldur.
tcrosley

Çok özlü (ve hoşuma gidiyor), ama bunun gibi bir şeyden çok farklı olduğundan emin değilim: Enumerable.Range (1, 10) .Aggregate ((s, x) => s + x); C # dan veya diğer dillerden
FinnNk

1

JavaFX'te Bağlanma Mekanizması (RIP). Bağlama anahtar kelime, bir ifadenin değerine bir değişkenin değerini bağlamak ve tüm bu çirkin Dinleyici olursa olsun Demirbaş kodu kurtulmak alma sağlar.

JavaFX birçok yönden başarısız olsa da, betik dilinin birçok özelliğini oldukça hoş buldum.


1

Dize karışımları artı D'deki derleme zamanı fonksiyon değerlendirmesi oldukça benzersiz bir katil özelliğidir. Evet, teknik olarak iki özellik, ancak gerçek güç onları birleştirmekten geliyor. Bu birleşim ile derleme zamanında bir dize olarak kod üreten normal D işlevleri yazabilir ve daha sonra bu kodu herhangi bir kapsamda karıştırıp normal D kodu olarak değerlendirmesini sağlayabilirsiniz. Kod tamamen statik olarak derlenir ve aynen elle yazılmış gibi çalışır. Bu özellik standart kütüphanede birkaç yapışkan durum etrafında çalışmak için bile kullanılır.


Ayrıca otomatik olarak bir yöntemden çıkarım dönüş türünü seviyorum ..
nawfal
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.