LISP:CHARは宣言されていないにも束縛もされていません
-
19-09-2019 - |
質問
私はLispの数日前(共通)を学ぶことを決めたと、私はこれは非常に初心者の質問であり、それは経験の少なくともビットで誰かにおそらく非常に些細であることを実現します。
だから、基本的に何が起こるかは、私が(ボックス内のLispの経由)のEmacs +スライムをロードし、私のプログラム(以下に含ま)を書くことです。
(defun last-char (s) "Get last character"
(char s (- (length s) 1)))
そして私はそれをコンパイルしよう C - C M - K が、その後、私は次の警告を取得します:
CHARは、宣言されていないにも拘束もされません それはSPECIAL宣言されたかのように扱われます。
この警告の意味は何ですか?私はそれがCでの#includeを忘れのようなものかもしれないと仮定し、私はかなりそれを把握することはできません。私はそれについて何をすべき?私は単にそれを無視するべきでしょうか。
解決
警告は、何らかの理由で(それはシンボルが結合していないですが、それが値を持たないことを報告しています)必要があるとしてchar
は、関数として認識されていないことを意味します。
それはあなたの実装とは何かを持っているかもしれません。私はSBCL +のEmacs /スライムにC-CのM-Kを使用してコードを実行します(とClozureで)、私は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.
タグだけで入力してみてください
#'char
REPLに、応答は、機能であると報告されていることである必要があり、
CL-USER> #'char
#<FUNCTION CHAR>
が、多分それはあなたの実装では(私はそれは、コンパイラの警告とコードがSBCLで正しくコンパイルという事実を与えられていない推測している)しません。その場合は、その関数があるはずですので、それが、あなたの実装はANSI Common Lispの仕様から外れたポイントです。
他のヒント
あなたのインデントについてだけ注意してください。ここではより多くの従来のインデントがあります:
(defun last-char (s)
"Get last character"
(char s (- (length s) 1)))