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 |

2011-05-29

'T と () は劣悪なパッケージ環境でも平気

| 17:09 | 'T と () は劣悪なパッケージ環境でも平気 - わだばLisperになる を含むブックマーク はてなブックマーク - 'T と () は劣悪なパッケージ環境でも平気 - わだばLisperになる

以前にも書いたMacLISPのコードに散見される誰かのスタイルですが、どうでも良いメリットを発見したのでメモしておきます。

そのメリットとは、'Tも () リードマクロが関係するために劣悪なパッケージ環境にも強いということです!

(make-package :foo :use nil)

(in-package :foo)

(cl:when '()
  "foo!")
;=> COMMON-LISP:NIL

(cl:when 'nil
  "foo!")
;=> "foo!"

(cl:when t
  "foo!")
;>>> error

(cl:when 't
  "foo!")
;=> "foo!"

(cl:when (quote ())
  "foo!")
;>>> error

(cl:when (quote nil)
  "foo!")
;>>> error

(cl:when (quote t)
  "foo!")
;>>> error

CLでSRFI-16

| 16:12 | CLでSRFI-16 - わだばLisperになる を含むブックマーク はてなブックマーク - CLでSRFI-16 - わだばLisperになる

今回は、SRFI-16 case-lambdaです。

拡張されていないSchemeにはCLでのラムダリスト的なものはなく、手短に書きたい時などのために簡便な方法が色々と考えられているようです。

case-lambdaは引数のパターンをcaseで判断してボディを実行するというもの。

(setf (symbol-function (intern (reverse (string 'arg-length))))
      (case-lambda ((x) 1)
                   ((x y) 2)
                   (args :many)))
;=> #<FUNCTION (LAMBDA (&REST #:G1)) {10174EF339}>

(htgnel-gra 1)
;=> 1

(htgnel-gra 1 2)
;=> 2

(htgnel-gra 1 2 3)
;=> :MANY

(htgnel-gra 1 2 3 4)
;=> :MANY

あまり見掛けない気もするので、検索してみたらcase-lambda自体の定義が殆どでした。

あまり使い勝手が良さそうでもないので、人気がないのかもしれません。