2012-04-18 29 views
9

Khi chúng tôi viết (trong một số ngôn ngữ này hay cách khác):Làm bất kỳ ngôn ngữ hiện có nào có cho phép các đối số chức năng ở các vị trí tùy ý trong tên chức năng không?

lengthOf(n) 

Chúng tôi nghĩ về nó như viết tắt của 'điền vào chỗ trống' xây dựng, giống như một tiếng anh:

length of __ 

Nhưng khi chúng tôi viết điều như thế này:

isAnInteger(n) 
    appendTo(n,m) 

Chúng tôi nghĩ về câu như:

__ is an integer 
    append ___ to ___ 

Vì vậy, nó sẽ có vẻ tự nhiên hơn để cho phép biểu thức chức năng gọi như:

(n)isAnInteger 
    append(n)to(m) 

Trường hợp 'tên hàm' là cái gì đó như:

_isAnInteger 
    append_to_ 

bất cứ ai có thể đặt tên cho chương trình hiện có ngôn ngữ cho phép điều này? Tôi biết ngôn ngữ hướng đối tượng cho phép đối tượng là một đối số ở phía trước, nhưng tôi tự hỏi về các cú pháp linh hoạt hơn.

+1

lời gọi phương pháp Objective-C thường có dạng '[anObject performOperation: operation withTask: task vàInteger: integer] ', vv Nó không phải là _flexible_ mỗi se, nhưng (IMO) đọc tự nhiên hơn. –

+0

Bạn có thể xác định các chức năng cơ bản trong tiêu chuẩn ML. Ví dụ, bạn có thể định nghĩa một hàm 'to' để người gọi viết' n đến m' thay cho 'to (n, m)'. Đó không phải chính xác những gì bạn đang tìm kiếm, nhưng nó chia sẻ một số điểm tương đồng (đặc biệt là vì bạn có thể viết cả 'append' và' to' để gọi 'append (n đến m)' sau này). –

+1

Smalltalk, Objective-C, Agda, BitC và các công cụ khác. Xem [Có một ngôn ngữ ngoài đó, trong đó các thông số được đặt bên trong tên phương thức?] (Http://programmers.stackexchange.com/questions/102906/) và [Có khoảng trống trong các mã định danh đã từng là thành ngữ không?] (Http://programmers.stackexchange.com/questions/145751/) –

Trả lời

1

Có, một điều như vậy không tồn tại, nhưng không phải trong cú pháp chính xác được trình bày trong câu hỏi.

Trong JavaScript nó được gọi là chaining và thường được tìm thấy trong các khuôn khổ như jQuery để làm cho nó dễ dàng để tạo và sửa đổi các yếu tố DOM on the fly:

$('<div/>') 
.css('background', '#f00') 
.css('width', '100px') 
.css('height', '100px') 
.hide() 
.appendTo('BODY') 
.fadeIn(); 

Đoạn jQuery trước tạo ra một yếu tố DIV, bộ chiều rộng, chiều cao và màu nền, ẩn DIV, gắn nó vào tài liệu và áp dụng hiệu ứng mờ dần.

Cú pháp là quan trọng. Đưa ra ví dụ sau:

(n)isAnInteger 
append(n)to(m) 

Dấu ngoặc đơn rõ ràng có nghĩa là dấu phân tách đối số hàm. Nhưng bạn cũng cần các dấu phân tách tên hàm và các dấu phân tách đối tượng/vật. Một cú pháp tốt hơn sẽ là:

n.isAnInteger().append(n).to(m) 

Đó là rất tương tự như cú pháp jQuery:

$('DIV') 
    .filter(':visible') 
    .appendTo('#new_element'); 

Mà sẽ tìm DIV yếu tố mà có thể nhìn thấy và sao chép chúng vào các phần tử với id của new_element.

+3

Người hỏi không hỏi về cú pháp * tốt hơn *, họ hỏi về một cú pháp * cụ thể *. –

+0

chức năng chuỗi là bất cứ điều gì nhưng * tùy ý *. – RBarryYoung

0

Objective-C có thể đến gần nhất. Ví dụ:

- (void)setRangeStart:(int)start end:(int)end; 

- (void)importDocumentWithName:(NSString *)name withSpecifiedPreferences: 
(Preferences *)prefs beforePage:(int)insertPage; 

gọi như:

[obj setRangeStart:1 end:42]; 
[obj importDocumentWithName:@"foo" withSpecifiedPreferences:prefs beforePage:1]; 

Nó không cho phép [obj 5:isAnInteger] mặc dù.

1

Smalltalk khá gần. (Nó là cú pháp tương tự như Objective-C, được đề cập trong câu trả lời khác)

nhắn gửi trong Smalltalk làm không niềng răng sử dụng, nhưng theo các hình thức doSomething:with:

Vì vậy, bạn có thể viết:

5 isInteger 
aList appendTo: anotherList 
aList at: aPosition ifAbsent: anAction 

Tất cả các tin nhắn được gửi đến một đối tượng (người nhận) mà phải ở bên trái, vì vậy bạn có thể không viết:

append: aList to: anotherList "illegal syntax" 

Cú pháp doSomething:with: là tự nhiên hơn việc sử dụng niềng răng. Bạn ít bị nhầm lẫn về tham số nào là gì. Ví dụ: xem xét ví dụ:

aList.sublist(i, j) 
    aList sublistFrom: i to: j 

Đặt tên đúng phương pháp, rõ ràng đối số đầu tiên là chỉ mục thấp hơn và chỉ số thứ hai phía trên, không giống với niềng răng.

3

Mixfix là hình thức chung nhất của những gì được trình bày ở trên dưới dạng tính năng cú pháp Smalltalk thông qua Objective-C. Maude's "bubble" parsing là cách thực hiện tài liệu rõ ràng nhất về điều này. Nói chung, google for "mixfix parsing".

1

Grace là một ngôn ngữ giáo dục mới (vẫn còn đang phát triển), mà hỗ trợ một trật tự gần như độc đoán của đối số:

class MyObject { 
    method choseBetween (a : Block<None>) and (b : Block<None>) -> None { 
     if (Random.nextBoolean) 
      then { a.apply } else { b.apply } } 
} 

mà có thể được gọi là:

MyObject.new.chooseBetween { print("Yes") } and { print("No") } 
0

Hai ngôn ngữ với những hoạt động mixfix hỗ trợ đến với tâm trí của tôi: AgdaBitC.

3

Như Brian Rice đã chỉ ra, ký hiệu mixfix trong Maude xử lý chính xác điều này. Bạn thậm chí đã có cú pháp chính xác.

ví dụ của bạn

_isAnInteger 
append_to_ 

sẽ được công bố trong Maude như

op _IsAnInteger : Int -> Bool 
op append_to_ : Int List -> List 

Và sẽ được gọi là

5 IsAnInteger 
append 5 to L 
Các vấn đề liên quan