CHỈNH SỬA: Tôi đã thay đổi mã mẫu sau câu trả lời đầu tiên vì tôi đã đưa ra một phiên bản đơn giản yêu cầu cùng một câu hỏi.Phạm vi Lisp chung (động và từ vựng)
Tôi hiện đang học thuộc tính phạm vi của Common Lisp. Sau khi tôi nghĩ rằng tôi đã có một sự hiểu biết vững chắc, tôi quyết định viết một số ví dụ mà tôi có thể dự đoán kết quả của, nhưng dường như tôi đã sai. Tôi có ba câu hỏi, mỗi người có liên quan đến một ví dụ dưới đây:
Ví dụ 1:
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
Output:
5
*** - EVAL: variable X has no value
Câu hỏi: Đây có ý nghĩa. x là phạm vi tĩnh và fun2 không có cách nào để tìm giá trị của x mà không có nó được truyền một cách rõ ràng.
Ví dụ 2:
(defvar x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
Output:
5
5
Câu hỏi: Tôi không hiểu tại sao x là đột nhiên nhìn thấy fun2 với giá trị fun1 đó đã cho nó, thay vì có một giá trị của 100 ...
Ví dụ 3:
(setf x 100)
(defmethod fun1 (x)
(print x)
(fun2))
(defmethod fun2()
(print x))
(fun1 5)
Output:
5
100
Câu hỏi: Tôi có nên bỏ qua những kết quả kể từ khi gọi setf trên một biến chưa được khai báo là dường như không xác định? Điều này xảy ra là những gì tôi mong chờ trong ví dụ thứ hai của tôi ...
Bất kỳ cái nhìn sâu sắc sẽ được đánh giá rất ...
Dưới đây là lời giải thích ngây thơ của tôi sau khi chơi xung quanh một chút ... cho tôi biết nếu tôi gần .. Exmaple 1: không cần giải thích Ví dụ 2: khai báo x là một biến động gây ra tất cả các trường hợp x được tra cứu tại thời gian chạy trên ngăn biến động, điều này sẽ khiến fun2 kế thừa giá trị của x từ fun1, mặc dù không phải là biến động. Ví dụ3: không có ý tưởng ... Tôi đoán không xác định của nó –
* Việc đặt câu hỏi * là tốt. * Các câu hỏi bắt đầu * là xấu ** ** –
Thay vì DEFMETHOD sử dụng DEFUN. DEFMETHOD không cần thiết trong các ví dụ này. DEFUN tạo ra một hàm đơn giản. DEFMETHOD dành cho các chức năng chung, nơi bạn cần một số điều phối. –