Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-07-03

KMRCLを眺める(171) ENSURE-KEYWORD-UPCASE

| 22:07 | KMRCLを眺める(171) ENSURE-KEYWORD-UPCASE - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(171) ENSURE-KEYWORD-UPCASE - わだばLisperになる

今回は、KMRCLのsymbols.lispからENSURE-KEYWORD-UPCASEです。

前回のENSURE-KEYWORDと同じく文字列指示子的なものを与えると、キーワードシンボルを返すというものですが、結果が大文字になることを保証するもののようです。

動作は、

(LET ((*READTABLE* (COPY-READTABLE)))
  (SETF (READTABLE-CASE *READTABLE*) :DOWNCASE)
  (EVAL
   (READ-FROM-STRING "(|KL|:|ENSURE-KEYWORD-UPCASE| 'foo)")))
;⇒ :FOO

というところで、ENSURE-KEYWORDと同じ条件(標準のREADTABLEでない状態)で比較すると

(LET ((*READTABLE* (COPY-READTABLE)))
  (SETF (READTABLE-CASE *READTABLE*) :DOWNCASE)
  (EVAL
   (READ-FROM-STRING "(|KL|:|ENSURE-KEYWORD| 'foo)")))
;⇒ :|foo|

動作が違ってきているのが分かります。

定義は、

(defun ensure-keyword-upcase (desig)
  (nth-value 0 (intern (string-upcase
                        (symbol-name (ensure-keyword desig))) :keyword)))

となっていますが、ENSURE-KEYWORDの使われ方が微妙な気が…

desigは文字列指示子を期待していて、STRING-UPCASEも同様なので、これなら

(defun ensure-keyword-upcase (desig)
  (nth-value 0 (ensure-keyword (string-upcase desig))))

でもOKな気がします。

いやENSURE-KEYWORDが*READTABLE*の値に影響を受けるので、

(defun ensure-keyword-upcase (desig)
  (nth-value 0 (intern (string-upcase desig) :keyword)))

等でないと駄目か。