2009-07-27 29 views
5

Tôi đã quyết định tìm hiểu (Common) Lisp cách đây vài ngày và tôi nhận ra rằng đây là một câu hỏi mới và nó có lẽ rất tầm thường đối với một người có ít kinh nghiệm nhất.Lisp: CHAR không được khai báo hay ràng buộc

Vì vậy, về cơ bản những gì xảy ra là tôi tải lên Emacs + Slime (thông qua Lisp trong một Box) và viết chương trình của tôi (bên dưới):

(defun last-char (s) "Get last character" 
     (char s (- (length s) 1))) 

Và sau đó tôi cố gắng biên dịch nó với C - cM - k, nhưng sau đó tôi nhận được cảnh báo sau đây:

CHAR không phải là tuyên bố cũng không bị ràng buộc, đó sẽ được coi như thể nó đã được tuyên bố ĐẶC BIỆT.

Ý nghĩa của cảnh báo này là gì? Tôi cho rằng nó có thể là một cái gì đó tương tự như quên #includes trong C, nhưng tôi không thể tìm ra nó. Tôi nên làm gì với nó? Tôi chỉ đơn giản là bỏ qua nó?

+4

có một số từ CHAR trong tệp của bạn là biến. Bạn biên dịch toàn bộ tập tin với c-c m-k. Kiểm tra tệp của bạn, có gì trong đó? Chỉ có chức năng trên? Sau đó, chúng tôi sẽ không thấy lỗi. –

+0

Rainer Joswig: Đó là chính xác những gì đã xảy ra. –

+1

Tôi thường sử dụng C-c C-c để (biên dịch lại) chỉ có dạng toplevel tại điểm. Nếu có điều gì lạ xảy ra, hãy thụt lại toàn bộ tệp (C-M-q với toàn bộ tệp dưới dạng vùng) và tìm định dạng lạ. Trong trường hợp của bạn, bạn có thể nhận thấy rằng phần thân hàm được thụt vào lạ; đây là một gợi ý rằng, chống lại giả định giả định của bạn, nó không phải là một hình thức toplevel trong tập tin. – Svante

Trả lời

5

Cảnh báo có nghĩa là char không được công nhận là hàm, vì lý do nào đó (báo cáo là biểu tượng không bị ràng buộc, biểu tượng không có giá trị).

Nó có thể có liên quan đến việc triển khai của bạn. Tôi đã chạy mã của bạn sử dụng Cc Mk trong SBCL tôi + Emacs/Slime (và trong Clozure) và tôi nhận được báo cáo sau đây từ biên soạn trong SBCL:

; in: DEFUN LAST-CHAR 
;  (CHAR S (- (LENGTH S) 1)) 
; --> AREF 
; ==> 
; (SB-KERNEL:HAIRY-DATA-VECTOR-REF ARRAY SB-INT:INDEX) 
; 
; note: unable to 
; optimize 
; due to type uncertainty: 
; The first argument is a STRING, not a SIMPLE-STRING. 
; 
; note: unable to 
; avoid runtime dispatch on array element type 
; due to type uncertainty: 
; The first argument is a STRING, not a SIMPLE-ARRAY. 

Hãy thử chỉ cần gõ

#'char 

trên REPL, phản hồi phải được báo cáo là một hàm,

CL-USER> #'char 
#<FUNCTION CHAR> 

nhưng có thể nó không nằm trong quá trình triển khai của bạn (tôi đoán là không, do cảnh báo trình biên dịch và thực tế mã com cọc đúng trong SBCL). Nếu đó là trường hợp, thì đó là điểm mà triển khai của bạn khởi động từ đặc tả ANSI thường gặp của ANSI, bởi vì chức năng đó nên ở đó.

+0

Cảm ơn rất nhiều! Hóa ra chức năng ở đó, tôi chỉ bỏ qua một lỗi đánh máy trong một chức năng khác và đó là nguyên nhân gây ra vấn đề. Lý do câu trả lời của bạn rất hữu ích là vì nó đảm bảo với tôi rằng vấn đề thực sự là trong mã của tôi và không phải ở một nơi khác. –

+0

Đó là lý do tại sao bạn luôn sao chép/dán mã trong các câu hỏi! –

1

Chỉ cần lưu ý về sự thụt lề của bạn. Dưới đây là thụt lề thông thường hơn:

(defun last-char (s) 
    "Get last character" 
    (char s (- (length s) 1))) 
Các vấn đề liên quan