2012-06-11 22 views
6

Tôi đã chơi xung quanh với D, cố gắng bắt chước Scala style curryable functions bằng cách biểu diễn chuỗi lambda.Tạo hàm curryable với lambdas trong D không hoạt động như class struct memebers

tôi đến với điều này:

immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
struct S 
{ 
    static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
} 
class C  static immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
} 

void main() 
{ 
    writefln("global\t%s",foo(1)(2)); 
    writefln("struct\t%s",S.foo(1)(2)); 
    writefln("class\t%s",C.foo(1)(2)); 
} 

Đây là những gì tôi nhận được khi tôi chạy nó:

global 3 
struct 1528543170 
Segmentation fault 

Như bạn có thể thấy, phương pháp của tôi hoạt động tốt cho biến chức năng toàn cầu, nhưng biến chức năng tĩnh của cấu trúc cho kết quả rác, và biến chức năng tĩnh của lớp không hoàn toàn. Nếu tôi xóa x khỏi biểu thức trả lại - function(immutable int x)=>(immutable int y)=>(y) - phiên bản cấu trúc cung cấp kết quả chính xác (2), nhưng phiên bản lớp vẫn không thành công.

Nếu tôi sử dụng một phương pháp thông thường, thay vì một biến chức năng:

immutable foo=function(immutable int x)=>(immutable int y)=>(x+y); 
struct S 
{ 
    static auto foo(immutable int x) 
    { 
     return (immutable int y)=>(x+y); 
    } 
} 
class C 
{ 
    static auto foo(immutable int x) 
    { 
     return (immutable int y)=>(x+y); 
    } 
} 

void main() 
{ 
    writefln("global\t%s",foo(1)(2)); 
    writefln("struct\t%s",S.foo(1)(2)); 
    writefln("class\t%s",C.foo(1)(2)); 
} 

nó hoạt động tốt:

global 3 
struct 3 
class 3 

Và tôi cũng có được lợi thế của việc sử dụng các đại biểu (trình biên dịch giành' t cho phép các đại biểu trong phiên bản đầu tiên) - nhưng phong cách này ít thanh lịch hơn.

Tôi biết rõ rằng D có chức năng curry trong thư viện std.functional cho chức năng currying, nhưng đôi khi sẽ thoải mái hơn khi thực hiện chức năng theo mặc định và bên cạnh - Tôi tò mò muốn biết tại sao phiên bản đầu tiên của tôi không ' t làm việc.

Bất kỳ ý tưởng nào?

CẬP NHẬT

OK, I've filed a bug. Tôi đã thực hiện một số chi tiết đào, và nó quay ra danh sách đối số của foo được chuyển, và đó là lý do tại sao x nhận được dữ liệu rác.

+0

WHOA bạn có thể nói 'function' * và * nói' => 'cùng một lúc ?! Không biết điều đó! :) – Mehrdad

+0

Nhân tiện, bạn có thử nói 'static __gshared' thay vì' static' bằng bất kỳ cơ hội nào không? * Có lẽ * nó sẽ hoạt động (ngón tay vượt qua ... Tôi không có một trình biên dịch tiện dụng) – Mehrdad

Trả lời

4

Thành thật mà nói, có vẻ như bạn đã gặp phải lỗi trình biên dịch. Please report it. Vì các biến trong cấu trúc và lớp là tĩnh, hành vi của chúng phải giống với biến của biến cấp mô-đun và rõ ràng là không có.

+0

Nó thực sự là một lỗi trình biên dịch. Tôi thu hẹp nó xuống một số chi tiết và báo cáo nó. –