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 |

2008-04-24

LISP1.5でL-99 (P04 リストの長さ)

| 01:37 | LISP1.5でL-99 (P04 リストの長さ) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P04 リストの長さ) - わだばLisperになる

LISP1.5には標準でLENGTHがあるようです。(エミュレータには何故か無いのですが…。)

SIZEは、再帰版で、SIZE-ITERは、ループ版ってことで書いてみました。ちなみに、DEFINEのは一度に複数の定義が書けます。

SIZE((A B C D E F))
SIZE-ITER((A B C D E F))

;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; SIZE
;
; ((A B C D E F))
;
;
; END OF EVALQUOTE, VALUE IS ..
; 6
;
;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; SIZE-ITER
;
; ((A B C D E F))
;
;
; END OF EVALQUOTE, VALUE IS ..
; 6

DEFINE ((
(SIZE (LAMBDA (LST)
        (COND ((NULL LST) 0)
              (T (ADD1 (SIZE (CDR LST)))))))

(SIZE-ITER (LAMBDA (LST)
             (PROG (L CNT)
                   (SETQ CNT 0)
                   (SETQ L LST)
                L  (COND ((NULL L) (RETURN CNT)))
                   (SETQ CNT (ADD1 CNT))
                   (SETQ L (CDR L))
                   (GO L))))    
    ))