2010-03-29 29 views

Trả lời

7

đây là những gì tôi sử dụng để bóp nghẹt cả thời gian biên dịch và thời gian chạy (load-time) cảnh báo định nghĩa lại:

(locally 
    (declare #+sbcl(sb-ext:muffle-conditions sb-kernel:redefinition-warning)) 
    (handler-bind 
     (#+sbcl(sb-kernel:redefinition-warning #'muffle-warning)) 
    ;; stuff that emits redefinition-warning's 
    )) 

sau mô hình này bạn có thể cài đặt các xử lý trên superclasses như cl: phong cách cảnh báo để bóp nghẹt tất cả cảnh báo kiểu.

+0

Đó có phải là công việc nếu tôi chỉ thêm nó vào cuối tệp '.sbclrc' của tôi không? Tôi đã làm điều đó, bắt đầu REPL từ dòng lệnh, nhập '(setq x 1)', và nó vẫn phun ra một cảnh báo ... ('; trong: SETQ X; (SETQ X 1);; bị bắt CẢNH BÁO: biến không xác định: X; đơn vị biên soạn đã hoàn thành; Biến không xác định:; X; bắt gặp 1 CẢNH BÁO condition1 * ') –

+1

đọc kỹ hơn. '(tại địa phương (tuyên bố # + sbcl (sb-ext: bóp nghẹt điều kiện cl: cảnh báo)) (handler-bind (# + sbcl (cl: cảnh báo # 'cảnh báo bóp nghẹt-)) (setq x 1))) ' –

2

Bạn có thể muốn xem SB-EXT:MUFFLE-CONDITIONS.

+2

Các điều kiện khác nhau có thể bị bóp nghẹt ở đâu? Tôi muốn trộn tất cả các cảnh báo kiểu và tài liệu này yếu. –

+0

Hiện đã nhận được 404. –

+0

@Owen_R Liên kết này dường như đang hoạt động tại thời điểm này. –

10

Bạn có thể sử dụng SB-EXT:MUFFLE-CONDITIONS như Pillsy cho biết, cách khác là đọc qua các cảnh báo và sử dụng chúng để sửa đổi mã của bạn để xóa cảnh báo. Đặc biệt nếu chúng thực sự là cảnh báo (thay vì, nói, ghi chú tối ưu hóa).

3

Tôi không thể nhận được SB-EXT: MUFFLE-CONDITIONS để làm việc cho các cảnh báo biến không được xác định cao gây phiền nhiễu ngay cả sau nhiều googling. Cảnh báo đó khiến tôi cảm thấy khó chịu khi thử nghiệm tại REPL, vì vậy tôi đã làm tất cả những cuốn sách đề nghị chúng ta nên làm: mở rộng lisp để phù hợp với nhu cầu/sở thích của tôi!

Tôi đã viết setq riêng của mình để tắt cảnh báo sbcl, macro đầu tiên của tôi bao giờ :). Tôi chắc chắn có những cách tốt hơn để làm điều đó nhưng điều này làm việc tuyệt vời cho tôi, và nó đi ngay vào ~/.sbclrc của tôi!

(defmacro sq (var value) 
    `(progn 
     (defvar ,var ,value) 
     (setq ,var ,value))) 
+0

Tôi thường chỉ định nghĩa các biến trước khi sử dụng chúng, hoặc với defvar (' (defvar x 3) 'không dài hơn' (setq x 3) ') hoặc cho phép. –

+3

Đối với các chương trình, đây không phải là vấn đề. Đối với các thí nghiệm REPL, việc xác định trước các biến để làm im lặng cảnh báo là một PITA chính. – Bogatyr

+0

Chỉ cần bạn biết, bạn đang đánh giá giá trị hai lần là hình thức nghèo nàn. Xem alexandria: một lần duy nhất – spacebat

2

Sau nhiều faffing về
và slogging thông qua tài liệu hướng dẫn được viết bởi những người dường như bị dị ứng với ví dụ cụ thể đơn giản
(mà có vẻ là tài liệu hướng dẫn nhất đối với hầu hết mọi thứ)
Tôi nghĩ rằng tất cả các bạn cần phải làm gì để vô hiệu hóa tất cả cảnh báo
là thêm dòng này trong .sbclrc tập tin của bạn:

(declaim (sb-ext:muffle-conditions cl:warning)) 

Để vô hiệu hóa chỉ phong cách cảnh báo, đó là:

(declaim (sb-ext:muffle-conditions cl:style-warning)) 

tôi đã cố gắng để vô hiệu hóa đặc biệt là cảnh báo mà đi lên nếu bạn nhập ví dụ (setq x 1) tại một tươi REPL

; in: SETQ X 
;  (SETQ X 1) 
; 
; caught WARNING: 
; undefined variable: X 
; 
; compilation unit finished 
; Undefined variable: 
;  X 
; caught 1 WARNING condition 

Bằng cách sử dụng này:

(declaim (sb-ext:muffle-conditions sb-kernel:redefinition-warning)) 

nhưng không hoạt động,
(rõ ràng là redefinition-warning có nghĩa là một cái gì đó khác)
và tôi không thể tìm thấy nó nên là gì.
Tôi đoán sb-kernel:undefined-warning
nhưng điều đó không tồn tại.

Sử dụng một macro

Ngoài ra,
liên quan @ câu trả lời Bogatyr của
(sử dụng một macro để tự động chạy defvar)
và @ bình luận spacebat của
(tức vĩ mô được đánh giá giá trị gấp đôi)
Tôi có điều này để nói rằng:

Là một newb khác đang gặp phải điều này,
Tôi muốn giới thiệu bản trình bày t hat macro evals hai lần,
và hiển thị phiên bản chỉ đánh giá một lần.

(
tôi ban đầu được sửa nó trong ở phần cuối của câu hỏi
nhưng nó đã bị từ chối vì:.
"chỉnh sửa này được dự định để giải quyết các tác giả của bài và làm cho không có ý nghĩa như một chỉnh sửa Nó nên đã được viết như một lời nhận xét hoặc câu trả lời."

Vâng, bạn không thể trả lời một câu trả lời,
nhưng ý kiến ​​không thể lấy khối mã,
vì vậy tôi đoán tôi nên đặt nó ở đây để thay thế?
)

gốc

(defmacro sq (var value) 
    `(progn 
     (defvar ,var ,value) 
     (setq ,var ,value))) 

    (sq v (princ "hi")) 
  • tác dụng phụ: in hihi
  • giá trị trả về: "hi"

viết lại 2 - chỉ evals một lần, luôn luôn chạy defvar

(defmacro sq2 (var value) 
(let 
    ((value-to-set value)) 
    `(progn 
     (defvar ,var) 
     (setq ,var ,value-to-set)))) 

    (sq2 v (princ "hi")) 
  • tác dụng phụ: in hi
  • giá trị trả về: "hi"

viết lại 3 - tương tự như trên, nhưng phức tạp hơn để đọc

tôi đã sử dụng value-to-set cho rõ ràng,
nhưng bạn chỉ có thể sử dụng value một lần nữa mà không có vấn đề gì:

(defmacro sq3 (var value) 
(let 
    ((value value)) 
    `(progn 
     (defvar ,var) 
     (setq ,var ,value)))) 

    (sq3 v (princ "hi")) 

viết lại 4 - chỉ chạy defvar nếu t ông biến là không ràng buộc

Chạy các macro sẽ luôn luôn xác định các biến trước khi đặt nó,
vì vậy nếu v là đã "ràng buộc", nhưng không phải là "định nghĩa"
(tức là bạn đã giới thiệu nó với setq)
sau đó giành chiến thắng không nhận thêm bất kỳ thông báo lỗi nào khi bạn sử dụng biến,
hoặc đặt lại với setq.

Dưới đây là một phiên bản của vĩ mô
rằng chỉ chạy defvar nếu biến chưa được ràng buộc:

(defmacro sq4 (var value) 
    (let 
    ((value-to-set value)) 
    (if (boundp var) 
     `(setq ,var ,value-to-set) 
     `(progn 
      (defvar ,var) 
      (setq ,var ,value-to-set))))) 

    (sq4 v (princ "hi")) 

Vì vậy, nếu bạn sử dụng nó để thiết lập một biến đó là ràng buộc nhưng không được định nghĩa
nó sẽ tiếp tục cho bạn thông báo lỗi.
(Đó là có thể là một điều tốt?
Giống như, cho cùng một lý do-I-đừng-thực-bí quyết tại sao các thông báo lỗi tồn tại ở nơi đầu tiên.)

[
Ngoài ra,
tôi đã thử nghiệm vĩ mô bằng các:

(sq4 value   1    ) 
(sq4 value   'value  ) 
(sq4 value   'value-to-set ) 
(sq4 value   'var   ) 
(sq4 value-to-set 1    ) 
(sq4 value-to-set 'value  ) 
(sq4 value-to-set 'value-to-set ) 
(sq4 value-to-set 'var   ) 
(sq4 var    1    ) 
(sq4 var   'value   ) 
(sq4 var   'value-to-set ) 
(sq4 var   'var   ) 

(bạn đã biết, việc kiểm tra tôi đã không hơi say lên và ... làm điều gì đó kỳ lạ.)

những nơi tôi cố gắng sử dụng var như một lỗi bị biến đổi.

Lúc đầu, tôi nghĩ rằng mình đã làm hỏng điều gì đó,
nhưng thực ra nó chỉ dành riêng cho một cái gì đó đặc biệt trong chính SBCL (?).

(defvar var) được:

; debugger invoked on a SYMBOL-PACKAGE-LOCKED-ERROR in thread 
; #<THREAD "main thread" RUNNING {AB5D0A1}>: 
; Lock on package SB-DEBUG violated when globally declaring VAR SPECIAL while 
; in package COMMON-LISP-USER. 
; See also: 
; The SBCL Manual, Node "Package Locks" 

... Vì vậy, khi nghi ngờ, tránh sử dụng các biểu tượng var, tôi đoán.
]

+0

Đã lâu rồi nhưng tôi lại quan tâm một lần nữa khi tôi nhận thấy điều này. Tôi đồng ý rằng nó hữu ích để có điều này cho mucking về trong REPL. Đây là phiên bản thực hiện kiểm tra giới hạn tại thời điểm đánh giá, không phải thời gian mở rộng macro và hỗ trợ thiết lập tài liệu: https://gist.github.com/4ea0ae200c4cb2ce7a8e4a7fd5f4029a – spacebat

+0

Mã ở đây có vấn đề về đánh giá gấp đôi. Có thể muốn sửa nó. – Gewthen

0

Nếu cảnh báo là tất cả các bạn quan tâm, bạn có thể thiết lập:

(setf sb-ext:*muffled-warnings* 'style-warning)

này sẽ chỉ áp dụng đối với cảnh báo phong cách và cho phép cảnh báo và các điều kiện khác để in ra. Mọi cảnh báo chia sẻ cùng một cha mẹ sẽ tự động bị tắt tiếng.

Các vấn đề liên quan