2010-09-18 36 views
17

Dấu chấm hỏi trong cú pháp Erlang có nghĩa là gì?Erlang: Cú pháp chấm hỏi có nghĩa là gì?

Ví dụ:

Json = ?record_to_json(artist, Artist). 

Bối cảnh đầy đủ của nguồn có thể được tìm thấy here.

+0

Đã sử dụng google nhưng không tìm ra bất kỳ thứ gì (cho: "cú pháp đánh dấu câu hỏi erlang"). Có lẽ tôi nên kích hoạt lịch sử web hoặc một cái gì đó để có được kết quả có liên quan hơn (thậm chí sử dụng cùng một kết quả từ khóa không giống nhau cho tất cả mọi người đặc biệt là trên các từ khóa riêng biệt). nhưng cảm ơn cho bình luận ... vẫn còn tôi sẽ đánh giá cao một người nào đó với kinh nghiệm erlang cung cấp một số bối cảnh sâu sắc hơn về cách và tại sao sử dụng ... –

+13

@ delnan - Googling trả lời câu hỏi này – OrangeDog

Trả lời

23

Erlang sử dụng dấu chấm hỏi để xác định macros. Ví dụ: xem xét các mã bên dưới:

-ifdef(debug). 
-define(DEBUG(Format, Args), io:format(Format, Args)). 
-else. 
-define(DEBUG(Format, Args), void). 
-endif. 

Như các tài liệu nói,

Macros được mở rộng quá trình biên dịch. Một macro đơn giản ?Const sẽ được thay thế bằng Replacement.

đoạn này định nghĩa một macro gọi DEBUG mà được thay thế bằng một cuộc gọi để in một chuỗi nếu debug được đặt ở thời gian biên dịch. Macro sau đó được sử dụng trong đoạn mã sau như sau:

?DEBUG("Creating ~p for N = ~p~n", [First, N]), 

Tuyên bố này được mở rộng và thay thế bằng các nội dung thích hợp nếu debug được thiết lập. Do đó bạn chỉ có thể xem thông báo gỡ lỗi nếu debug được đặt.

Cập nhật

Nhờ @rvirding:

Một dấu hỏi có nghĩa là để thử và mở rộng những gì sau khi một cuộc gọi vĩ mô. Không có gì cấm sử dụng tên macro (nguyên tử hoặc biến) làm nguyên tử hoặc biến thông thường. Vì vậy, trong ví dụ trên, bạn có thể sử dụng DEBUG làm biến số bình thường miễn là bạn không thêm tiền tố với ?. Khó hiểu, chắc chắn nhất, nhưng không phải là bất hợp pháp.

+3

Để được cầu kỳ: một dấu hỏi có nghĩa là để thử và mở rộng những gì sau như một cuộc gọi macro. Không có gì cấm sử dụng tên macro (nguyên tử hoặc biến) làm nguyên tử hoặc biến thông thường. Vì vậy, trong ví dụ của bạn, bạn có thể sử dụng 'DEBUG' như một biến bình thường, miễn là bạn không thêm tiền tố bằng'? '. Khó hiểu, chắc chắn nhất, nhưng không phải là bất hợp pháp. – rvirding

+0

@rvirding: Cảm ơn! Có shamelessly vay nó và thêm vào câu trả lời của tôi. –

5

Dựa trên this documentation, tôi tin rằng đó là cú pháp để tham chiếu đến macro.

Và từ Learn You Some Erlang:

macro Erlang là thực sự giống với C '#define' báo cáo, sử dụng chủ yếu để xác định chức năng ngắn và hằng số. Chúng là các biểu thức đơn giản được biểu thị bằng văn bản sẽ được thay thế trước khi mã được biên dịch cho máy ảo. Các macro như vậy chủ yếu là hữu ích để tránh có các giá trị ma thuật nổi xung quanh các mô-đun của bạn. Macro được định nghĩa là thuộc tính mô-đun của biểu mẫu: -define (MACRO, some_value). và được sử dụng như? MACRO bên trong bất kỳ hàm nào được xác định trong mô-đun. Một vĩ mô 'chức năng' có thể được viết là -define (phụ (X, Y), X-Y). và được sử dụng như thế nào? (23,47), sau đó được thay thế bằng trình biên dịch 23-47 . Một số người sẽ sử dụng các macro phức tạp hơn, nhưng cú pháp cơ bản vẫn giữ nguyên.

Các vấn đề liên quan