2011-12-13 53 views
5

Làm cách nào để chạy hàm số lớn hơn 1 từ dòng lệnh UNIX?cách chạy chương trình erlang với chức năng của arity lớn hơn 1 từ dòng lệnh

dụ chương trình:

-module(test). 
-export([sum/2]). 
sum(X,Y)->io:write(X+Y). 

Sau khi biên soạn

erlc test.erl

Tôi đang cố gắng một cái gì đó giống như

ERL -noshell -s thử nghiệm tổng 5 3 -s init stop

nhưng rõ ràng nó không hoạt động bởi vì nó đối xử với 5 3 dạng danh sách ...

Trả lời

5

Tạo một chức năng mà phải mất một danh sách, như vậy:

-module(test). 
-export([sum/2, start/1]). 

start(Args) -> 
    % Pick X and Y args out of Args list and convert to integers 
    sum(X, Y). 
sum(X, Y) -> io:write(X+Y). 

Bây giờ khi dòng lệnh của bạn chuyển danh sách tới hàm khởi động, nó sẽ phá vỡ danh sách và thực hiện tổng kết. Lưu ý Tôi đã không thử nghiệm này, nhưng nó sẽ làm việc nếu bạn đang nhận được các đối số như là một danh sách.

+0

Lưu ý rằng để sử dụng dòng lệnh bạn không phải gọi nó là 'bắt đầu', bạn cũng có thể xác định nó là' tổng kết' như sau: 'sum ([X, Y]) -> sum (X, Y) .' và xuất dưới dạng 'sum/1' (bạn không nhất thiết phải xuất phiên bản' sum/2'). Ngay lập tức không rõ ràng với tôi như một người mới đến Erlang. – atomicules

3

Tôi không biết bất kỳ cách nào để có được xung quanh yêu cầu mà hàm được đặt có một đối số. Như Cody đề cập, một đối số có thể là một danh sách, bạn có thể hủy cấu trúc trong định nghĩa danh sách tham số.

Sử dụng dòng lệnh bạn đã cho, điều này làm việc cho tôi:

-module(test). 
-export([sum/1]). 

sum([X, Y]) -> 
    io:format("X: ~p Y: ~p", [X, Y]), 
    list_to_integer(atom_to_list(X)) + list_to_integer(atom_to_list(Y)). 
+0

Tôi biết rằng phải có một cách thanh lịch hơn để chọn các số nguyên trong danh sách. Cảm ơn! :) – Cody

+0

Đây không phải là một trường hợp rất chung chung. –

+0

Thực tế là không, vì nó giả định một danh sách gồm hai phần tử cho một tham số. Nó phù hợp với câu hỏi ban đầu, và việc khái quát hóa cách tiếp cận này là đơn giản. Bạn đề nghị điều gì? – Ben

4

Youcan sử dụng công tắc -eval để thay thế.

erl -eval 'io:format("~p",[hello]).' 
Các vấn đề liên quan