LuaTeX: Phương pháp mã hóa tốt nhất lua
Một số phương pháp mã hóa tốt nhất cần tuân theo khi tách và tải mã lua từ nhiều tệp lua bên ngoài và xử lý mã lua từ các gói lualatex khác. Suy nghĩ này xuất hiện trong tâm trí tôi vì bây giờ tôi có một loạt các tệp lua mà tôi có thể tải và sử dụng, nhưng nó không phải là mã được phân chia rõ ràng nhất. Một vài câu hỏi được đặt ra là "Ghi chú bên lề" ở đây được lặp lại bên dưới với sự rõ ràng hơn (và bổ sung):
Về phạm vi và có thể xảy ra xung đột tên của "biến cục bộ" trong tệp lua bên ngoài: Trong tệp linebreak.lua của câu hỏi này , phạm vi của biến cục bộ là
local n, head, lastgì? Nếu tôi tải một tệp lua khác với "request" và có các biến cục bộ được đặt tên tương tự, đó có phải là vấn đề không? Lua có giữ các biến cục bộ cục bộ cho các hàm trong tệp mà nó đang được tải từ đó không? (ngay cả khi tôi vừa tải chúng trong không gian tên chung)Cách tốt nhất để giữ cho các biến và hàm trong một tệp không bị xung đột / ghi đè / can thiệp vào các biến và hàm trong tệp khác là gì?
Nó có phải là một phần của hướng dẫn tài liệu dành cho nhà phát triển gói lualatex để ghi lại những gì họ đang thêm vào không gian tên chung không? Trong trường hợp một gói lualatex ghi tên vào không gian tên chung và nó xung đột với tên biến / hàm của tôi, thì đâu là nơi tốt nhất để bắt đầu gỡ lỗi?
Phạm vi giữa hai khối directlua / latelua khác nhau là gì? Theo quan sát của tôi, các biến cục bộ là cục bộ đối với các khối directlua và trước đây tôi đã sử dụng không gian tên toàn cục để "chuyển" các giá trị từ khối directlua này sang khối directlua khác. Có cách nào sạch hơn tránh sử dụng không gian tên chung không?
Trả lời
Các biến Lua là cục bộ của hàm hoặc phạm vi mà chúng được xác định. Các tệp nguồn riêng biệt tạo thành phạm vi, vì vậy mỗi phạm vi require()có nghĩa là các biến là cục bộ của tệp đó. Điều này cũng đúng với \directluacác cuộc gọi, nhưng khác với các ứng dụng tầm thường, bạn nên tải mã Lua bằng cách sử dụng một \directlua{require("myfile")}dòng duy nhất . Tôi nghĩ rằng cần thêm chi tiết về những gì bạn đang làm để bình luận thêm về 'chuyển thông tin giữa \directluacác cuộc gọi'.
Thông thường, cách tốt nhất để xử lý các hình cầu là khai báo một bảng duy nhất và có tất cả các tài liệu toàn cục trong đó. Có một số cách, nhưng ví dụ:
foo = foo or { }
foo.my_func = function(...)
end
hoặc là
foo = foo or { }
local function my_func(...)
end
foo.my_func = foo.my_func or my_func
Nếu muốn, bạn có thể bao gồm một bài kiểm tra an toàn cho bảng toàn cầu
if foo then
print("Oh no, someone has taken my table")
os.exit(1)
end
Không có tài liệu / hệ thống chính thức để xử lý không gian tên chung. Tôi khuyên bạn nên làm theo phương pháp tương tự như được sử dụng cho macro TeX: chọn một tên hợp lý dựa trên tên gói của bạn.