Pattern Hizalama ve Birleştirme
Pattern sisteminin temel özelliklerinden biri, yapıları farklı olsa bile patternlerin esnek biçimde birleştirilebilmesidir. Bildirimsel yaklaşım sayesinde canlı kod yazan kişi işlemin nasıl yapılacağını ayrıntılarıyla düşünmek zorunda kalmaz; yalnızca ne yapılacağını tarif eder.
Basit bir örnek olarak iki sayı patterni düşünelim: "0 [1 2] 3" ve "10 20". İlk pattern eşit uzunlukta üç ardışık adımdan oluşur; ikinci adım iki alt adıma bölündüğü için toplamda dört event üretir. Bu iki patternin yapısı pek çok farklı şekilde birleştirilebilir, fakat varsayılan yöntem iki patternin cycle sınırlarını hizalamak, sonra ilk patterndeki eventleri ikinci patterndeki eventlerle eşleştirmektir. Bu yüzden aşağıdaki iki satır eşdeğerdir:
'0 [1 2] 3'.add('10 20');
('10 [11 22] 23');
Eventler yalnızca kısmen örtüştüğünde, ilk patterndeki eventin parçaları gibi değerlendirilirler. Bu fikir ilk bakışta soyut gelebilir; aşağıdaki örnekte iki patterni karşılaştırarak başlayalım:
'0 1 2'.add('10 20');
('10 [11 21] 22');
Önceki örneğe benzer şekilde 1 sayısı ikiye bölünür; ilk yarısı 10 ile, ikinci yarısı 20 ile toplanır. Fakat 11, aslında özgün 1 eventinin bir parçası olduğunu “hatırlar”. Bu nedenle yalnızca cycle’ın altıda biri boyunca aktif olsa bile, süresi cycle’ın üçte biriymiş gibi ele alınır. Aynı şekilde 21 de özgün 1 eventinin ikinci yarısına ait bir parçadır. Eventin başlangıcı eksik olduğu için, başka pattern dönüşümleri veya birleştirmeleri uygulanmadıkça tek başına ses tetiklemez.
Pratikte iki patterni birleştiren bu varsayılan örtük yöntem, ikinci patternin ilk patternin içine eklenmesi gibi çalışır. Bunu açıkça şöyle yazabiliriz:
'0 1 2'.add.in('10 20');
Bu yapı patternleri farklı biçimlerde hizalamaya da kapı açar. Özellikle şu hizalama yöntemleri tanımlıdır:
in- Yukarıda anlatıldığı gibi cycle’ları hizalar ve sağdaki patternden gelen değerleri soldaki patternin içine uygular.out-ingibidir, fakat değerler soldaki patternin dışına, yani sağdaki patternin içine doğru uygulanır.mix- İki patternin yapısını birlikte kullanır. Yeni eventler parça gibi değil, iki taraftaki eventlerin kesişim noktalarında oluşur.squeeze- Sağdaki patternin cycle’larını soldaki eventlerin içine sıkıştırır. Örneğin"0 1 2".add.squeeze("10 20"),"[10 20] [11 21] [12 22]"ile eşdeğerdir.squeezeout-squeezegibidir, fakat soldaki cycle’lar sağdaki eventlerin içine sıkıştırılır. Bu yüzden"0 1 2".add.squeezeout("10 20"),[10 11 12] [20 21 22]ile eşdeğerdir.reset- Sağdaki cycle’ları soldaki eventlerle hizaladığı içinsqueezeout’a benzer. Farkı, cycle’ların sıkıştırılmaması; evente sığacak şekilde kesilmesidir. Örneğin"0 1 2 3 4 5 6 7".add.reset("10 [20 30]"),10 11 12 13 20 21 30 31ile eşdeğer olur. Etki olarak sağdaki eventler soldaki cycle’ları “resetler”.restart-resetgibidir; fakat pattern geçerli cycle’dan değil, en baştaki ilk cycle’dan yeniden başlatılır. Bu yüzdenresetverestart, yalnızca en soldaki pattern cycle’dan cycle’a değişiyorsa farklı sonuçlar üretir.
Bu hizalama fonksiyonlarının arka planı, tasarım tercihleri ve pratik kullanımları daha derin bir konu. Şimdilik önemli olan nokta şu: patternleri birleştirirken yalnızca değerler değil, zaman içindeki konumları ve süreleri de birlikte ele alınır.