Dil sözdiziminize bağlı olarak dikkate alınması gereken iki farklı durum vardır. Diliniz işlev uygulamasını (örn. f(2+1)
) Belirtmek için parantez kullanıyorsa , öncelik önemsizdir. İşlev yığının üzerine itilmeli ve sonra dışarı çıkarılmalıdır (yukarıdaki örnek için sonuç 2 1 + f
). Alternatif olarak, işleve bir değer olarak davranabilir ve hemen çıktısını verebilir ve yakın parantezden sonra (başka bir parantezle aynı şekilde işlem görmesi gerekir), örneğin işlev çağırma işlemi f 2 1 + $
nerede bir işlev çağırma işlemi çıktısı alabilirsiniz $
.
Bununla birlikte, diliniz işlev çağrışımını belirtmek için parantez kullanmıyorsa, bunun yerine argümanı herhangi bir özel noktalama işareti olmadan doğrudan işlevden sonra yerleştiriyorsa (örneğin f 2 + 1
, Wikipedia örneğinde olduğu gibi), işler biraz daha karmaşıktır. Bir örnek verdiğim ifadenin belirsiz olduğunu unutmayın: f , sonuca 2 ve 1'e eklenir mi, yoksa 2 ve 1'i birlikte ekleyip sonuçla birlikte f'yi çağırır mıyız ?
Yine, iki yaklaşım vardır. Karşılaştığınızda işlevi işleç yığınına itebilir ve istediğiniz önceliğe atayabilirsiniz. Bu en basit yaklaşımdır ve görünüşe göre alıntı yapılan örnek budur. Bununla birlikte, pratik konular var. İlk olarak, bir işlevi nasıl tanımlarsınız? Sonlu bir kümeniz varsa bu kolaydır, ancak kullanıcı tanımlı işlevleriniz varsa, ayrıştırıcınızın ortamınıza çok fazla geri beslenmesi gerektiği anlamına gelir, bu da hızlı bir şekilde dağınık hale gelebilir. Ve birden çok argümana sahip işlevleri nasıl ele alırsınız?
Benim düşüncem, bu sözdizimi stili için, işlevleri bir işlev uygulama operatörü tarafından işlenen değerler olarak kullanmak çok daha mantıklıdır. Ardından, bir değeri okuduğunuzda uygulama operatörünü enjekte edebilirsiniz ve okuduğunuz son şey de bir değerdir, bu nedenle hangi tanımlayıcıların işlevler olduğunu söylemenin özel bir yoluna ihtiyacınız yoktur. İşlevleri döndüren ifadelerle de çalışabilirsiniz (işlev olarak işlev stili ile zor veya imkansızdır). Ve bu, birden fazla argüman işlevini işlemek için köriyi kullanabileceğiniz anlamına gelir;
O zaman karar vermeniz gereken tek şey fonksiyon uygulamasının önceliğinin ne olduğudur. Seçim size kalmış, ancak bu şekilde çalışan her dilde, dilde en güçlü bağlayıcı operatör ve doğru ilişkilendirici olmuştur. (Tek ilginç varyasyon Haskell'dir ve güçlü bağlanma versiyonuna sahip olmanın yanı sıra $
, dilde en zayıf bağlayıcı operatör olan, f 2 + 1
f'ye 2'yi f $ 2 + 1
uygulamak ve uygulamak gibi ifadelere izin veren sembol ile eşanlamlıdır. ifadenin geri kalanının tamamına)
sin( max( 2 3) / 3 * 3.1415)