Ini ialah arahan PDL::Dataflowp yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.
JADUAL:
NAMA
PDL::Dataflow -- perihalan falsafah aliran data
SINOPSIS
pdl> $a = sifar(10);
pdl> $b = $a->slice("2:4:2");
pdl> $b ++;
pdl> cetak $a;
[0 0 1 0 1 0 0 0 0 0.
BERKHATAN :
Aliran data adalah sangat eksperimen. Banyak cirinya dilumpuhkan untuk 2.0, terutamanya
keluarga untuk aliran data satu arah. Jika anda ingin menggunakan aliran data satu arah untuk
sesuatu, sila hubungi pengarang dahulu dan kami akan mencari cara untuk menjadikannya berfungsi
lagi.
Aliran data dua arah (yang melaksanakan ->kepingan () dll.) berfungsi sepenuhnya, walau bagaimanapun.
Hampir mana-mana fungsi yang mengembalikan beberapa subset nilai dalam beberapa piddle akan membuat a
mengikat supaya
$a = beberapa piddle
$b = $a->slice("beberapa bahagian");
$b->set(3,3,10);
juga menukar elemen yang sepadan dalam $a. $b telah menjadi tingkap dengan berkesan kepada sesetengah orang
sub-elemen $a. Anda juga boleh menentukan rutin anda sendiri yang melakukan pelbagai jenis
subset. Jika anda tidak mahu $b menjadi tingkap kepada $a, anda mesti melakukannya
$b = $a->slice("beberapa bahagian")->copy;
Penyalinan mematikan semua aliran data antara dua piddle.
Kesukaran dengan aliran data satu arah berkaitan dengan urutan seperti
$b = $a + 1;
$b ++;
di mana terdapat beberapa kemungkinan hasil dan semantik menjadi sedikit keruh.
DESCRIPTION
Aliran Data adalah baharu kepada PDL2.0. Falsafah asas di sebalik aliran data ialah
> $a = pdl 2,3,4;
> $b = $a * 2;
> cetak $b
[2 3 4]
> $a->set(0,5);
> cetak $b;
[10 3 4]
patut bekerja. ia tidak. Ia dianggap bahawa melakukan ini mungkin terlalu mengelirukan
orang baru dan pengguna bahasa itu sekali-sekala. Oleh itu, anda perlu menghidupkan secara eksplisit
aliran data, jadi
> $a = pdl 2,3,4;
> $a->doflow();
> $b = $a * 2;
...
menghasilkan hasil yang tidak dijangka. Selebihnya dokumen ini menerangkan pelbagai ciri dan
butiran pelaksanaan aliran data.
Lazy penilaian
Apabila anda mengira sesuatu seperti di atas
> $a = pdl 2,3,4;
> $a->doflow();
> $b = $a * 2;
tiada apa yang akan dikira pada ketika ini. Malah ingatan untuk kandungan $b
belum diperuntukkan. Hanya perintah
> cetak $b
sebenarnya akan menyebabkan $b dikira. Ini penting untuk diingat semasa melakukan
pengukuran prestasi dan penanda aras serta semasa menjejak ralat.
Terdapat penjelasan untuk tingkah laku ini: ia mungkin menjimatkan kitaran tetapi yang lebih penting,
bayangkan perkara berikut:
> $a = pdl 2,3,4;
> $b = pdl 5,6,7;
> $c = $a + $b;
...
> $a->mengubah saiz(4);
> $b->mengubah saiz(4);
> cetak $c;
Sekarang, jika $c dinilai antara kedua-dua saiz semula, keadaan ralat tidak serasi
saiz akan berlaku.
Apa yang berlaku dalam versi semasa ialah mengubah saiz $a menaikkan bendera dalam $c:
"PDL_PARENTDIMSCHANGED" dan $b hanya menaikkan bendera yang sama sekali lagi. Apabila $c dinilai seterusnya,
bendera diperiksa dan didapati pengiraan semula diperlukan.
Sudah tentu, penilaian yang malas kadangkala boleh membuat penyahpepijatan lebih menyakitkan kerana ralat mungkin
berlaku di tempat yang anda tidak jangkakan. Jejak tindanan yang lebih baik untuk ralat adalah dalam
berfungsi untuk PDL, mungkin supaya anda boleh menogol suis $PDL::traceevals dan mendapat yang baik
mengesan di mana kesilapan sebenarnya.
Keluarga
Ini adalah salah satu konsep aliran data satu arah yang lebih rumit. Pertimbangkan
kod berikut ($a dan $b ialah pdls yang mempunyai aliran data didayakan):
$c = $a + $b;
$e = $c + 1;
$d = $c->diagonal();
$d ++;
$f = $c + 1;
Apakah yang perlu ada dalam $e dan $f sekarang? Bagaimana pula apabila $a ditukar dan pengiraan semula
dicetuskan.
Untuk membuat aliran data berfungsi seperti yang anda jangkakan, konsep yang agak pelik mestilah
diperkenalkan: keluarga. Mari kita buat gambar rajah:
ab
\ /
c
/|
/ |
ed
Inilah yang sebenarnya ada dalam ingatan PDL selepas tiga baris pertama. Apabila $d diubah,
kami mahu $c berubah tetapi kami tidak mahu $e berubah kerana ia sudah ada pada graf. Ia
mungkin tidak jelas sekarang mengapa anda tidak mahu ia berubah tetapi jika terdapat 40 baris kod
antara baris ke-2 dan ke-4, anda akan melakukannya. Jadi kita perlu membuat salinan $c dan $d:
ab
\ /
c' . . . c
// |\
/ | | \
ed' . . . df
Perhatikan bahawa kami menyempurnakan c dan d asal, kerana ia tidak sepadan dengan objek
dalam $c dan $d lagi. Juga, perhatikan garis putus-putus antara dua objek: apabila $a ialah
diubah dan rajah ini dinilai semula, $c benar-benar mendapat nilai c' dengan
diagonal bertambah.
Untuk membuat generalisasi mengenai perkara di atas, setiap kali piddle dimutasi iaitu apabila *nilai* sebenarnya
diubah secara paksa (bukan hanya rujukan:
$d = $d + 1
akan menghasilkan hasil yang sama sekali berbeza ($c dan $d tidak akan terikat lagi sedangkan
$d .= $d + 1
akan menghasilkan yang sama seperti $d++), "keluarga" yang terdiri daripada semua piddle lain yang dicantumkan pada
piddle bermutasi oleh transformasi dua hala dicipta dan semua itu disalin.
Semua kepingan atau transformasi yang hanya memilih subset pdl asal adalah dua hala.
Matriks songsang sepatutnya. Tiada pengendali aritmetik.
Sumber
Apa yang anda diberitahu dalam bahagian sebelumnya adalah tidak benar: tingkah laku yang diterangkan adalah
bukan *selalu* apa yang anda mahukan. Kadangkala anda mungkin ingin mempunyai "sumber" data:
$a = pdl 2,3,4; $b = pdl 5,6,7;
$c = $a + $b;
baris($c);
Sekarang, jika anda tahu bahawa $a akan berubah dan anda mahu anak-anaknya berubah dengannya
itu, anda boleh mengisytiharkannya sebagai sumber data (XXX tidak dilaksanakan dalam versi semasa):
$a->sumber data(1);
Selepas ini, $a++ atau $a .= sesuatu tidak akan mewujudkan keluarga baru tetapi akan mengubah $a dan memotong
hubungannya dengan ibu bapanya yang terdahulu. Semua anak-anaknya akan mengikut nilai semasa.
Jadi jika $c dalam bahagian sebelumnya telah diisytiharkan sebagai sumber, $e dan $f akan kekal
sama rata.
Binding
Mekanisme aliran data tidak akan sangat berguna tanpa keupayaan untuk mengikat peristiwa ke
menukar data. Oleh itu, kami menyediakan mekanisme sedemikian:
> $a = pdl 2,3,4
> $b = $a + 1;
> $c = $b * 2;
> $c->bind( sub { print "A sekarang: $a, C sekarang: $c\n" } )
> PDL::downenidle();
A sekarang: [2,3,4], C sekarang: [6 8 10]
> $a->set(0,1);
> $a->set(1,1);
> PDL::downenidle();
A sekarang: [1,1,4], C sekarang: [4 4 10]
Perhatikan bagaimana panggilan balik hanya dipanggil semasa PDL::dowhenidle. Cara mudah untuk antara muka
ini kepada mekanisme gelung peristiwa Perl (seperti Tk) sedang dirancang.
Terdapat banyak jenis kegunaan untuk ciri ini: graf mengemas kini sendiri, contohnya.
Bla bla bla XXX lagi penjelasan
Batasan
Dataflow oleh itu adalah tambahan yang agak terhad di atas Perl. Untuk mendapatkan yang lebih halus
Selain itu, dalaman Perl perlu digodam sedikit. Pelaksanaan yang benar akan
membolehkan aliran segala-galanya, termasuk
data
ukuran data
jenis data
operasi
Pada masa ini kami hanya mempunyai dua yang pertama (hei, 50% dalam beberapa bulan tidaklah buruk;) tetapi
malah ini berguna dengan sendirinya. Walau bagaimanapun, terutamanya yang terakhir adalah wajar kerana ia
akan menambah kemungkinan penutupan mengalir dari satu tempat ke satu tempat dan akan membuat banyak
perkara yang lebih fleksibel.
Untuk membolehkan selebihnya berfungsi, dalaman aliran data mungkin perlu diubah menjadi a
rangka kerja yang lebih umum.
Di samping itu, adalah bagus untuk dapat mengalirkan data dalam masa, seperti jelas (supaya anda boleh
dengan mudah mentakrifkan semua jenis perkara pemprosesan isyarat).
Gunakan PDL::Dataflowp dalam talian menggunakan perkhidmatan onworks.net