first, second, third 、、、

 newLISP には、first は有りますが、second, third 等はありません。
 別に無くても、インデックス機能があるので、要らないのですが、困ったこともあります。

> ('(0 1 2) 2)
2
> ('(0 1) 2)

ERR: list index out of bounds
> 

 こんな風に、範囲外を指定するとエラーになります。最初に length でリストの大きさを調べるか、catchthrow の組み合わせれば良いのですが、結構手間なので、私は“newlisp-utility.lsp”で次のように登録して、使っています。

(define cdr    (fn (lst) (or (rest lst) nil)))
(define car    (fn (lst) (if (empty? lst) nil (first lst))))
(define second (fn (lst) (first (or (rest lst) '(nil)))))
(define third  (fn (lst) (first (or (rest (rest lst)) '(nil)))))
(define fourth (fn (lst) (first (or (rest (rest (rest lst))) '(nil)))))

 これなら、

> (third '(1 2 3))
3
> (third '(1 2))
nil
> 

 こんな感じで、範囲外は nil になってくれます。
 また、carcdr は、引数が空リスト () の時、nil が返ります。私のスクリプトで、時々、carcdr を使っているのは、そういう効果を期待していたりします。
 さて今回、carcdr 共に、second 以下を一新しました。

(define cdr    (fn (lst) (if-not (nil? lst) (or (rest lst) nil))))
(define car    (fn (lst) (first (or lst '(nil)))))
(define second (fn (lst) (car (cdr lst))))
(define third  (fn (lst) (car (cdr (cdr lst)))))
(define fourth (fn (lst) (car (cdr (cdr (cdr lst))))))

 変更点は、上記関数の引数が nil の時でも、nil を返すようにしたこと。
 と言うことで、またまた、ですが、“newlisp-utility.lsp”のアップデートです(笑)。

 以上、如何でしょうか?

No comments yet

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。