這個問題是關於sbcl - 或者我原本以爲。問題:什麼時候角色不是角色?請看下面的代碼:sbcl(和clisp):何時一個角色不是角色? (使用defconstant)
(defconstant +asc-lf+ #\Newline)
(defconstant +asc-space+ #\Space)
(prin1 (type-of #\Newline )) (terpri)
(prin1 (type-of #\Space )) (terpri)
(prin1 (type-of +asc-lf+ )) (terpri)
(prin1 (type-of +asc-space+)) (terpri)
正如預期的那樣,它產生:
STANDARD-CHAR
STANDARD-CHAR
STANDARD-CHAR
STANDARD-CHAR
現在考慮下面的代碼:
(defun st (the-string)
(string-trim '(#\Newline #\Space) the-string))
(princ "\"")
(princ (st " abcdefgh "))
(princ "\"")
(terpri)
它產生:
"abcdefgh"
但想一想代碼:
(defconstant +asc-lf+ #\Newline)
(defconstant +asc-space+ #\Space)
(defun st (the-string)
(string-trim '(+asc-lf+ +asc-space+) the-string))
(princ "\"")
(princ (st " abcdefgh "))
(princ "\"")
(terpri)
當加載使用SBCL它,它給你:
While evaluating the form starting at line 6, column 0
of #P"/u/home/sbcl/experiments/type-conflict.d/2.lisp":"
debugger invoked on a TYPE-ERROR:
The value
+ASC-LF+
is not of type
CHARACTER
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [RETRY ] Retry EVAL of current toplevel form.
1: [CONTINUE] Ignore error and continue loading file "/u/home/sbcl/experiments/type-conflict.d/2.lisp".
2: [ABORT ] Abort loading file "/u/home/sbcl/experiments/type-conflict.d/2.lisp".
3: Exit debugger, returning to top level.
((FLET SB-IMPL::TRIM-CHAR-P :IN SB-IMPL::GENERIC-STRING-TRIM) #\)
0]
起初,我期待能夠報告CLISP做出適當的呼叫#'string-trim
,與預期的返回值,或者可能出錯。但它沒有這些。該函數返回傳遞給它的相同字符串,而不進行任何修剪。
這是應該發生什麼?我錯過了什麼?
編輯約。 2017-10-21 08:50 UTC
由提供的正確答案PuercoPop激發了後續問題。如果我應該把這個問題作爲一個單獨的問題發佈,只要說出這個詞,我會的。
爲什麼是它(至少在SBCL和CLISP)這樣的:
(defconstant +asc-lf+ #\Newline)
(defconstant +asc-space+ #\Space)
(prin1 (type-of (first (list #\Newline #\Space))))
(terpri)
(prin1 (type-of (first '(#\Newline #\Space))))
(terpri)
產生呢?
STANDARD-CHAR
STANDARD-CHAR
隨着PuercoPop的回答,我本來期望它產生了一些關於符號,而不是一個字符,第二個表達式。
#\換行符是讀取器的語法,它構造在讀時間換行符對象。 –
有些東西可能會幫助你解決第二個問題:'(類型(第一'(1 2)))'應該是什麼? – tfb