Article:
Mẹo vặt Erlang
1616
alide.myopenid.com 32Updated 2 months ago |
Cài Erlang từ mã nguồn
Để có thể ./configure, make, make install trơn tru, trên Ubuntu cần cài các gói:
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install libpam0g-dev
Trên CentOS:
sudo yum install gcc
sudo yum install ncurses-devel
sudo yum install openssl-devel
sudo yum install libpam0g-dev
Erlang có chương trình debugger có GUI rất mạnh, nhưng nó đòi wxWidgets. Erlang R13B01 đòi wxWidgets 2.8. Ví dụ trên Ubuntu, trước khi build cần cài thêm các gói sau:
sudo apt-get install libwxbase2.8-dev
sudo apt-get install libwxgtk2.8-dev
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev
sudo apt-get install libglut3-dev
Để bật debugger, chạy erl -smp, rồi gõ debugger:start().
Để cài trên Snow Leopard ở chế độ 64 bit từ mã nguồn, khi configure cần thêm tham số --enable-darwin-64bit.
Erlide
Nó là plugin cho Eclipse. Tuy nhiên sau khi cài xong, click vào tập tin .erl sẽ thấy hiện thông báo đại loại "Error initializing editor". Cách giải quyết là click chuột phải vào project, rồi chọn "Toggle Erlang nature".
Ngoài ra, khi dùng Eclipse để viết chương trình web thì nên bật web ở cổng khác 8000, 3000 như Rails chẳng hạn, vì Eclipse thường chiếm mất cổng 8000.
Tra cứu tài liệu
- Tài liệu ở erlang.org khó tra. Tuy nhiên sắp có tính năng như gotapi.
- Trang gotapi giúp tra cứu rất nhanh, tuy nhiên có khi tài liệu không phải là của phiên bản Erlang mới nhất. Một số trang tương tự.
- Cách khác là download tài liệu về máy của mình, xem cấu trúc thư mục của nó để tìm đúng chỗ cần thiết.
Tìm vị trí của phần tử trong danh sách
string:str(List, [Element]). Bất ngờ chưa!
Unicode
Tham khảo:
Hiển thị Unicode trên Eshell (Erlang emulator)
Trước tiên là cách dùng Regular Expression cho Unicode (ví dụ tiếng Nhật). Bật Eshell với chỉ định cho LC_CTYPE:
LC_CTYPE=ja_JP.UTF-8 erl
Test:
1> lists:keyfind(encoding,1,io:getopts()).
{encoding,unicode}
2> "ベトナム".
[12505,12488,12490,12512]
3> io:format("~ts~n",[v(2)]).
ベトナム
Để hiển thị đúng cần modifier t, t ở đây là Unicode translation modifier.
v(2): kết quả của câu lệnh thứ 2, trường hợp này là chuỗi ký tự vừa nhập.
Regexp với Unicode
4> {match, M}=re:run("名前=キムタク","名前=(.*)",[unicode, {capture,all_but_first,list}]).
{match,[[12461,12512,12479,12463]]}
5> io:format("~ts~n", [M]).
キムタク
ok
Chuỗi gõ ở Eshell và ở tập tin mã nguồn không phải bao giờ cũng là một
Ví dụ trong tập tin mã nguồn lưu ở dạng UTF-8:
V = "tiếng Việt",
io:format("~p~n", [V])
Biên dịch rồi chạy sẽ ra kết quả:
[116,105,225,186,191,110,103,32,86,105,225,187,135,116]
Tất cả phần tử của mảng đều < 256, nghĩa là trình biên dịch đã biến đổi thành mảng byte tương thích với UTF-8. Còn nếu gõ trực tiếp từ Eshell:
1> "tiếng Việt".
[116,105,7871,110,103,32,86,105,7879,116]
Nghĩa là nếu có hàm nào đó nhận tham số là chuỗi Unicode, thì khi thử nghiệm ở Eshell, cần có bước biến đổi trung gian:
2> B = unicode:characters_to_binary("tiếng Việt").
<<116,105,225,186,191,110,103,32,86,105,225,187,135,116>>
3> L = binary_to_list(B).
[116,105,225,186,191,110,103,32,86,105,225,187,135,116]
Hiện ra toàn bộ màn hình khi escript kết thúc
Erlang có tính năng escript, không cần compile chương trình trước khi chạy. Nhưng có rắc rối là nếu chương trình xuất chuỗi kí tự gì đó ra màn hình, khi chương trình kết thúc nếu không xử lí đặc biệt thì thường chuỗi kí tự chưa được xuất ra hết mà chương trình đã kết thúc mất.
Cần làm như đoạn mã ở dưới. Chú ý nếu bỏ dòng (1) hoặc (2) thì sẽ bị hiện tương trên.
main(_) ->
S = self(),
spawn_link(fun() ->
io:format("~p~p~n", [lists:duplicate(100000, $a), b]),
io:format(""), % (1)
S ! finished
end),
receive
finished ->
io:format(""), % (2)
halt(0);
_Other ->
halt(1)
end.
32
