Alıntı (canalpay):
> Bu arada function yerel işlevde değilde o yerel işlevi kapsayacak değişken ile işlem yapabiliyor mu ?
function, yalnızca işlevin gövdesi gibi düşünülebilir. Oluşturulduğu ortama bağlılığı bulunmuyor.
Alıntı:
> Tamam şu halde doğru çalışıyor:
>
> import std.stdio;
>
> void dene(string başlık, void function() işlem)
> {
>
> writeln(başlık, ':');
> write(" ");
> işlem();
> writeln();
>
> }
> string dizgi = "abcçdefgğhıijklmnoöpqrsştuüvwxyz";
>
> void main()
> {
> // ... Ali kırptı ...
>
> dene("foreach, dchar ile", function(){
> foreach (dchar harf; dizgi) {
> write(harf, ' ');
> }
> });
> }
>
> ```
Tabii onun çalışmasının nedeni, 'dizgi''nin artık evrensel olması ve 'function' oluşturulduğunda onun anlaşılması. Yani derleyici için bütün bilgi mevcut.
Alıntı:
>
>
> Ancak şu halde de doğru çalışmasını bekliyordum :
>
>
> import std.stdio;
void dene(string başlık, void function() işlem)
{
writeln(başlık, ':');
write(" ");
işlem();
writeln();
string dizgi = "abcçdefgğhıijklmnoöpqrsştuüvwxyz";
}
void main()
{
// ... Ali kırptı ...
dene("foreach, dchar ile", function(){
foreach (dchar harf; dizgi) {
write(harf, ' ');
}
});
}
>
Orada son 'foreach' satırı derlenemiyor çünkü derleyici 'foreach''teki 'dizgi''nin ne olduğunu bilemez.
Bunun nedeni, derleyici kodu bütünüyle irdelemez veya irdeleyemez. Orada ne olduğu bilinmeyen bir "dizgi" var. Ne o kapsamda bildirilmiş, ne de evrensel alanda. Derleyici o yüzden hata veriyor. Daha ileriye giderek onun gönderildiği işlevin içini de okuyarak oradaki "dizgi"nin kastedildiğine karar vermez.
Şöyle düşünelim:
if (bir_koşul) {
dene("foreach, dchar ile", function(){
foreach (dchar harf; dizgi) {
write(harf, ' ');
}
});
} else {
dene_2("foreach, dchar ile", function(){
foreach (dchar harf; dizgi) {
write(harf, ' ');
}
});}}}
}
Ya dene_2 işlevi içinde "dizgi" diye bir şey tanımlı değilse? Derleyici hata vermeli mi? Ya bir_koşul her zaman için true olacaksa? O zaman aslında hata olmamalı. vs. vs. Bu irdelemenin sonu yoktur.
O yüzden derleyici fazla derinine düşünmez ve zaten bazı durumlarda düşünemez.
Ortalığı karıştırmak için bir tane de benden: :)
import std.stdio;
void dene(string başlık, const char[] dizgi, void function(const char[]) işlem)
{
writeln(başlık, ':');
write(" ");
işlem(dizgi);
writeln();
}
void main()
{
string dizgi = "abcçdefgğhıijklmnoöpqrsştuüvwxyz";
dene("foreach, dchar ile", dizgi, function(const char[] parametre_dizgi){
foreach (dchar harf; parametre_dizgi) {
write(harf, ' ');
}
});
}
O kodda main içindeki dizgi dene'ye gönderiliyor. dene de onu işlem'e parametre olarak veriyor.
dizgi'yi dene içinde yazmak ve işlem'e parametre olarak vermek de olabilir:
import std.stdio;
void dene(string başlık, void function(const char[]) işlem)
{
writeln(başlık, ':');
write(" ");
işlem("abcçdefgğhıijklmnoöpqrsştuüvwxyz");
writeln();
}
void main()
{
dene("foreach, dchar ile", function(const char[] dizgi){
foreach (dchar harf; dizgi) {
write(harf, ' ');
}
});
}
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]