Merhaba,
Acaba D'de üçlü işleç kullanımı emekliye mi ayrıldı? Çünkü bir işlevin dönüşünde (return) tek satır halinde kullanmak istedim ama başarılı olamadım çünkü her seferinde varsayılan -1 parametresini döndürüyor! Ben de şu şekilde if() ile 2 satırda hallettim :)
import std.conv, std.meta, std.stdio;
template işlevKat(string f, string v) {
enum sonuç = `return dizi[i][`~v~`]`;
enum işlevKat = `T `~f~`(size_t i, T n = -1){`
~`if(n < 0)`~sonuç~`;`~sonuç~`= n;}`;
}
struct Nokta (T) {
T[][] dizi;
/* x, y, z isminde 3 işlev katar ve bunlar
* 3'lü her elemana ayrı ayrı erişir...
* ( -bknz. Pisagor Üçlüleri )
*/
static foreach(v, i; AliasSeq!("x", "y", "z"))
mixin(işlevKat!(i, to!string(v)));
}
Gerçi şablon kafa karıştırabilir, aslında x için derleme zamanında şunu üretiyor:
T x(size_t i, T n = -1) {
if(n < 0) return dizi[i][0];
return dizi[i][0] = n;
}
Ben ise bunu üretmek istiyorum:
T x(size_t i, T n = -1) {
return n < 0 ? dizi[i][0] : dizi[i][0] = n;
}
Örneği aşağıdaki ana kod ile derlerseniz ne demek istediğimi anlayacaksınız:
void main() {
int[][] pisagor = [ /* 100'den küçük ilk 16: */
[ 3, 4, 5],[ 5,12,13],[ 7, 24, 25],[ 8, 15, 17],
[ 9,40,41],[11,60,61],[12, 35, 37],[13, 84, 85],
[16,63,65],[20,21,29],[28, 45, 53],[33, 56, 65],
[36,77,85],[39,80,89],[48, 55, 73],[65, 72, 97]];
auto integer_sqrt(int i) {
int x = i;
int y = (x + 1) >> 1;
while (y < x) {
x = y;
y = (x + i / x) >> 1;
}
return x;
}
with(Nokta!int(pisagor)) {
int a, b, c, p = 5;
foreach(n; 0..dizi.length) {
p = cast(int)n;
a = x(p)^^2;
b = y(p)^^2;
c = a + b;
assert(z(p) == integer_sqrt(c));
}
writefln("%d² + %d² = %d", x(p), y(p), c);
writefln("\t\t\t\t c = %d", z(p));
x(p, a);
y(p, b);
z(p, c);
pisagor[5].writeln;
}
}/* ÇIKTISI:
11² + 60² = 3721
c = 61
[121, 3600, 3721]
*/
Bu arada Dlang okyanusunda sörflüyorken şu makaleye denge geldim; şablonlar ile çok işlevsel bir uygulama yapmışlar:
https://wiki.dlang.org/Using_string_mixins_for_logging
Başarılar...