D

2015-01-21 08:19
ufm: (bald-headed)
[personal profile] ufm

Вобще прикольненький такой язык. Со своими тараканами, конечно (ну почему у всех разработчиков языков программирования — столько в голове тараканов?), но прикольненький.


Типа: что выведет на экран эта программа?

import std.stdio;
import std.conv;


void ff(bool a, lazy string s) {
  if (a) {
    writeln(s);
    writeln(s);
    writeln(s);
  }
}


string ss() {
  static int a = 0;
  return "Some ss: " ~ (a++).to!string;
}


void main() {
  ff(true, ss());
  ff(false, ss());
}


Originally published at U.F.M's Homepage. You can comment here or there.

(no subject)

Date: 2015-01-21 07:36 (UTC)
From: [identity profile] -oxpa-.livejournal.com
я бы ожидал:
Some ss: 0
Some ss: 0
Some ss: 0

Впрочем, не было бы опроса, будь всё так легко, да?

(no subject)

Date: 2015-01-21 07:56 (UTC)
From: [identity profile] ufm.livejournal.com
да.
Выведет:
Some ss: 0
Some ss: 1
Some ss: 2

Причем, если переставить местами вызовы ff - вывод не изменится.

Параметр функции, описанный как lazy вычисляется только в момент обращения к этому параметру. Но, зато, вычисляется каждый раз.

(no subject)

Date: 2015-01-21 10:34 (UTC)
From: [identity profile] theiced.livejournal.com
похоже на баг, не?

(no subject)

Date: 2015-01-21 10:46 (UTC)
From: [identity profile] ufm.livejournal.com
Не. Очень подробно описано:
http://dlang.org/lazy-evaluation.html