2011-09-18 14 views
7

Một trong những vấn đề, đối với một số người trong chúng ta, với Javascript là việc thiếu toán tử quá tải. Điều này làm cho việc viết thư viện số khó xử. Ví dụ: chúng tôi có thể muốn viết một cái gì đó như:Thực hiện quá tải toán tử trong Javascript thông qua một transpiler

var a = new BigInteger(5); 
var b = new BigInteger(10); 
var c = a + b; 

Một giải pháp có thể là chuyển đổi ngôn ngữ với quá tải nhà điều hành sang Javascript. Trong khi khả thi - bằng cách thay thế các toán tử bằng các cuộc gọi hàm và kiểm tra kiểu - sự đồng thuận dường như là điều này là không thể mà không giết chết hiệu suất. CoffeeScript đã bác bỏ ý tưởng vì lý do này:

https://github.com/jashkenas/coffee-script/issues/846

Tuy nhiên, có thực sự không có các giải pháp thông minh? Ví dụ, nó có thể là loại hoist có thể kiểm tra ra khỏi vòng chặt chẽ hoặc sử dụng một số đường ống khác, nơi trình biên dịch JS hiện đại có thể tối ưu hóa đi thêm cruft khi các loại là số.

Ý tưởng?

+0

có thể bạn có thể gõ giả tĩnh bằng ký hiệu hungarian? Mã của bạn sẽ nổ tung ngoạn mục mà không có thông báo lỗi nếu bạn trộn ngay cả một loại ở bất kỳ đâu, tất nhiên. – evan

+0

Có một bài viết ở đây lại. JS quá tải nhà điều hành ... http://www.2ality.com/2011/12/fake-operator-overloading.html –

Trả lời

1

Có một cái nhìn như thế nào Scala thực hiện điều hành quá tải:

Họ định nghĩa rằng tất cả các nhà khai thác là một lời gọi phương thức trên một đối tượng, vì vậy ví dụ của bạn sẽ là:

var c = a["+"](b); 

Nếu bạn dừng lại ở đây, bạn có thể trivially thực hiện quá tải phương thức, chức năng sẽ phải kiểm tra các giá trị thông qua param. Nếu bạn muốn phát triển một giải pháp tốt hơn, hãy lập trình Odersky trong cuốn sách Scala và một thời gian để đọc tất cả ý tưởng của họ về cách họ giải quyết vấn đề (đó là một giải pháp rất tốt!)

+1

Điều này chỉ hoạt động nếu bạn đang thiết kế lại ngôn ngữ từ đầu (như trường hợp với Scala). Bạn thực sự không thể biến một nhà điều hành đơn hình thành một hình đa hình tại một ý thích: ( – hugomg

2

Bạn có thực sự chắc chắn bạn cần số có thể sử dụng được bằng các hàm cũ được viết với số bình thường trong tâm trí (sử dụng toán tử truyền thống)? Nếu bạn chỉ cần quá tải cho sự tiện lợi của riêng bạn trên các chức năng bạn kiểm soát hang động, bạn có thể có được bằng cách sử dụng khác nhau, tùy chỉnh điều hành cho bignums.

Ví dụ, bạn có thể viết một trình biên dịch để chuyển đổi một cách an toàn

var d = a <+> b <*> c; 

vào

var d = (a).add((b).multiply(c)); 

hoặc có lẽ, nếu bạn muốn chuyển đổi tự động ...

var d = toBignum(a).add(toBignum(b).multiply(toBignum(c))); 

Tôi không thực sự thấy bạn bei ng có thể buộc quá tải trên một thực hiện hiện tại mà không có một rắc rối lớn. Mặc dù bạn có thể thay thế tất cả các lần xuất hiện của + bằng < +> và như vậy, các triển khai Javascript hiện tại không được tối ưu hóa cho điều này và tôi thậm chí không muốn bắt đầu suy nghĩ điều gì sẽ xảy ra nếu bạn cố chuyển một bignum đến một Các hàm C++ nằm dưới mui xe.


chỉnh sửa: Không cần phải ghi đè lên các lớp cơ sở nguyên là điểm quan trọng ở đây (lưu ý cách trong liên kết mà bạn đã cung cấp, trọng là điều đầu tiên anh chàng muốn ...). Tôi không nghĩ rằng bạn sẽ có thể tìm thấy một số loại "ma thuật" tối ưu hóa mặc dù như bạn không có quyền kiểm soát mà nhiều triển khai JS đang được sử dụng bởi khách hàng.

Nếu bạn thực sự không thích nhà điều hành tùy chỉnh như < +> cách duy nhất để phân biệt toán tử + bình thường (bạn không thể can thiệp với) từ nhà điều hành + ưa thích (bạn muốn làm việc với bignum) được ép buộc một số loại hệ thống gõ-ad-hoc trên đầu trang của Javascript, có lẽ thông qua ý kiến, cú pháp tùy chỉnh hoặc (như đã đề cập trong một chú thích) ký hiệu hungarian. Chỉ cần giải quyết cho một tên nhà điều hành tùy chỉnh bạn ghét ít hơn sẽ ít hackish, IMO.

+0

Tôi không quan tâm đến chức năng Javascript cũ. Cú pháp mới như <+> là quá nhiều của một hack cho hương vị của tôi, vì + là những gì có nghĩa là. Hy vọng của tôi là có một số tối ưu hóa đã biết được tiếp tục trong trình biên dịch có thể được khai thác – Tristan

+0

Đã chỉnh sửa câu trả lời ... – hugomg