program ideone;
{$MODE OBJFPC}
type
Val = record
id: Integer;
name: String;
end;
Ref = class
public
id: Integer;
name: String;
end;
function NewVal(id: Integer; name: String): Val;
begin
Result.id := id;
Result.name := name;
end;
function NewRef(id: Integer; name: String): Ref;
begin
Result := Ref.Create;
Result.id := id;
Result.name := name;
end;
procedure PrintVal(const s: String; const v: Val);
begin
WriteLn('ValBy' + s, v.id, ' ', v.name);
end;
procedure PrintRef(const s: String; const r: Ref);
begin
WriteLn('RefBy' + s, r.id, ' ', r.name);
end;
procedure ValByVal(v: Val);
begin
v.name := 'Foo';
v := NewVal(123, 'Bar');
end;
procedure RefByVal(r: Ref);
begin
r.name := 'Foo';
r := NewRef(123, 'Bar');
end;
procedure ValByRef(var v: Val);
begin
v.name := 'Foo';
v := NewVal(123, 'Bar');
end;
procedure RefByRef(var r: Ref);
begin
r.name := 'Foo';
r := NewRef(123, 'Bar');
end;
procedure DemoValByVal;
var v: Val;
begin
v := NewVal(456, 'Val');
PrintVal('Val Before: ', v);
ValByVal(v);
PrintVal('Val After: ', v);
end;
procedure DemoRefByVal;
var r: Ref;
begin
r := NewRef(456, 'Ref');
PrintRef('Val Before: ', r);
RefByVal(r);
PrintRef('Val After: ', r);
end;
procedure DemoValByRef;
var v: Val;
begin
v := NewVal(456, 'Val');
PrintVal('Ref Before: ', v);
ValByRef(v);
PrintVal('Ref After: ', v);
end;
procedure DemoRefByRef;
var r: Ref;
begin
r := NewRef(456, 'Ref');
PrintRef('Ref Before: ', r);
RefByRef(r);
PrintRef('Ref After: ', r);
end;
begin
DemoValByVal;
WriteLn;
DemoRefByVal;
WriteLn;
DemoValByRef;
WriteLn;
DemoRefByRef;
end.
cHJvZ3JhbSBpZGVvbmU7Cgp7JE1PREUgT0JKRlBDfQoKdHlwZQoJVmFsID0gcmVjb3JkCgkJaWQ6ICAgSW50ZWdlcjsKCQluYW1lOiBTdHJpbmc7CgllbmQ7CglSZWYgPSBjbGFzcwoJcHVibGljCgkJaWQ6ICAgSW50ZWdlcjsKCQluYW1lOiBTdHJpbmc7CgllbmQ7CgpmdW5jdGlvbiBOZXdWYWwoaWQ6IEludGVnZXI7IG5hbWU6IFN0cmluZyk6IFZhbDsKYmVnaW4KCVJlc3VsdC5pZCAgIDo9IGlkOwoJUmVzdWx0Lm5hbWUgOj0gbmFtZTsKZW5kOwoKZnVuY3Rpb24gTmV3UmVmKGlkOiBJbnRlZ2VyOyBuYW1lOiBTdHJpbmcpOiBSZWY7CmJlZ2luCglSZXN1bHQgOj0gUmVmLkNyZWF0ZTsKCVJlc3VsdC5pZCAgIDo9IGlkOwoJUmVzdWx0Lm5hbWUgOj0gbmFtZTsKZW5kOwoKcHJvY2VkdXJlIFByaW50VmFsKGNvbnN0IHM6IFN0cmluZzsgY29uc3QgdjogVmFsKTsKYmVnaW4KCVdyaXRlTG4oJ1ZhbEJ5JyArIHMsIHYuaWQsICcgJywgdi5uYW1lKTsKZW5kOwoKcHJvY2VkdXJlIFByaW50UmVmKGNvbnN0IHM6IFN0cmluZzsgY29uc3QgcjogUmVmKTsKYmVnaW4KCVdyaXRlTG4oJ1JlZkJ5JyArIHMsIHIuaWQsICcgJywgci5uYW1lKTsKZW5kOwoKcHJvY2VkdXJlIFZhbEJ5VmFsKHY6IFZhbCk7CmJlZ2luCgl2Lm5hbWUgOj0gJ0Zvbyc7Cgl2IDo9IE5ld1ZhbCgxMjMsICdCYXInKTsKZW5kOwoKcHJvY2VkdXJlIFJlZkJ5VmFsKHI6IFJlZik7CmJlZ2luCglyLm5hbWUgOj0gJ0Zvbyc7CglyIDo9IE5ld1JlZigxMjMsICdCYXInKTsKZW5kOwoKcHJvY2VkdXJlIFZhbEJ5UmVmKHZhciB2OiBWYWwpOwpiZWdpbgoJdi5uYW1lIDo9ICdGb28nOwoJdiA6PSBOZXdWYWwoMTIzLCAnQmFyJyk7CmVuZDsKCnByb2NlZHVyZSBSZWZCeVJlZih2YXIgcjogUmVmKTsKYmVnaW4KCXIubmFtZSA6PSAnRm9vJzsKCXIgOj0gTmV3UmVmKDEyMywgJ0JhcicpOwplbmQ7Cgpwcm9jZWR1cmUgRGVtb1ZhbEJ5VmFsOwp2YXIgdjogVmFsOwpiZWdpbgoJdiA6PSBOZXdWYWwoNDU2LCAnVmFsJyk7CglQcmludFZhbCgnVmFsIEJlZm9yZTogJywgdik7CglWYWxCeVZhbCh2KTsKCVByaW50VmFsKCdWYWwgQWZ0ZXI6ICAnLCB2KTsKZW5kOwoKcHJvY2VkdXJlIERlbW9SZWZCeVZhbDsKdmFyIHI6IFJlZjsKYmVnaW4KCXIgOj0gTmV3UmVmKDQ1NiwgJ1JlZicpOwoJUHJpbnRSZWYoJ1ZhbCBCZWZvcmU6ICcsIHIpOwoJUmVmQnlWYWwocik7CglQcmludFJlZignVmFsIEFmdGVyOiAgJywgcik7CmVuZDsKCnByb2NlZHVyZSBEZW1vVmFsQnlSZWY7CnZhciB2OiBWYWw7CmJlZ2luCgl2IDo9IE5ld1ZhbCg0NTYsICdWYWwnKTsKCVByaW50VmFsKCdSZWYgQmVmb3JlOiAnLCB2KTsKCVZhbEJ5UmVmKHYpOwoJUHJpbnRWYWwoJ1JlZiBBZnRlcjogICcsIHYpOwplbmQ7Cgpwcm9jZWR1cmUgRGVtb1JlZkJ5UmVmOwp2YXIgcjogUmVmOwpiZWdpbgoJciA6PSBOZXdSZWYoNDU2LCAnUmVmJyk7CglQcmludFJlZignUmVmIEJlZm9yZTogJywgcik7CglSZWZCeVJlZihyKTsKCVByaW50UmVmKCdSZWYgQWZ0ZXI6ICAnLCByKTsKZW5kOwoKYmVnaW4KCURlbW9WYWxCeVZhbDsKCVdyaXRlTG47CglEZW1vUmVmQnlWYWw7CglXcml0ZUxuOwoJRGVtb1ZhbEJ5UmVmOwoJV3JpdGVMbjsKCURlbW9SZWZCeVJlZjsKZW5kLg==