Có thể sử dụng các khai báo (declare (type ...))
trong các chức năng mà còn thực hiện kiểm tra kiểu đối số chức năng để tạo mã nhanh hơn nhưng vẫn an toàn không?Sử dụng (khai báo (loại ...)) nhưng vẫn có chức năng 'an toàn'
Ví dụ,
(defun add (x y)
(declare (type fixnum x y))
(the fixnum x y))
khi gọi là (add 1 "a")
sẽ cho kết quả trong hành vi undefined, vì vậy tốt nhất là tôi muốn sửa đổi nó như
(defun add (x y)
(declare (type fixnum x y))
(check-type x fixnum)
(check-type y fixnum)
(the fixnum x y))
nhưng tôi lo ngại rằng trình biên dịch được phép giả sử rằng check-type
luôn chuyển và do đó bỏ qua kiểm tra.
Vì vậy, câu hỏi của tôi là, ví dụ ở trên sai như tôi mong đợi nó, và thứ hai, là có bất kỳ thành ngữ phổ biến * sử dụng để đạt được loại an toàn với mã tối ưu hóa?
*) Tôi có thể tưởng tượng, ví dụ, sử dụng lambda được tối ưu hóa và gọi sau khi thực hiện kiểm tra kiểu, nhưng tôi tự hỏi đó có phải là cách thanh lịch nhất hay không.
Tôi không nhận được trường hợp đơn giản mà bạn đang mang lại. Làm thế nào để các ngôn ngữ gõ tĩnh biết loại tương đương '(đọc)' của chúng tại thời gian biên dịch? –
Vâng, thực ra họ không thể. Theo nghĩa này, Lisp thường là "năng động hơn" (ai đó sẽ nói "mạnh hơn"). Một số người trong số họ không có bất kỳ tương đương với 'đọc', trong khi những người khác có thể sử dụng một loại đúc năng động, hủy bỏ những lợi ích của kiểm tra loại tĩnh. – Renzo
Tôi hiểu hệ thống kiểu của Common Lisp, nhưng tôi lo lắng rằng ngay sau khi bạn bắt đầu với tối ưu hóa trình biên dịch, sau đó đột nhiên mọi thứ có thể rời khỏi lĩnh vực thanh bình của gõ năng động và nhập nitty-gritty của ngôn ngữ máy. Mối quan tâm của tôi là chính xác khi hành vi đi đến điểm 3) của bạn thông qua '(khai báo (loại ...))' rằng mã ví dụ của tôi có thể biểu hiện hành vi không xác định. – MicroVirus