アカウント名:
パスワード:
「Case 3: '(1)→'()だけどうにかならないか」を諦めちゃうのであれば、普通に関数で書いた方がすっきりすると思います。
あと、せっかくなのでimproper-listに対応しました。こんな感じです:Case 4: (nakanuki! 2 '(1 2 3 . 4)) => '(1 2 . 4)Case 5: (nakanuki! 0 '(1 . 2)) => 2Case 6: (nakanuki! 1 '#1=(1 2 3 . #1#)) => '#1=(1 3 . #1#) ;; うーん。これは今ひとつかも。
(defun nakanuki! (idx lst) "lisからidx番目を破壊的に取り除く" (unless (= 0 idx) (error "idxの値(%d)がヘンですー" idx)) (cond ((atom (cdr lst)) ;; ↓互換性のために入れたけど、この1行は嫌だなぁ… (setf (car lst) (cdr lst)) (cdr lst)) ((= idx 0) (setf (car lst) (cadr lst)) (nakanuki! 1 lst)) (t (setf (cdr (nthcdr (1- idx) lst)) (nthcdr (1+ idx) lst)) lst)))
(unless (= 0 idx)
(unless (<=のミスですかね?"<"はタグ開始とみなされて投稿時に消えてしまうので
「Case 3: '(1)→'()だけどうにかならないか」を諦めちゃうのであれば
マクロにしたのは「Case 3 : '(1) -> '()」を一部でも対応するためです。(let ((subs '(1))) ;; subs にリストを束縛 (nakanuki 0 subs) ;; => nil ;; subs[0] を 中抜く subs) ;; => nil仕様として一定ではないのは、やはりイマイチなのですが…
普通に関数で書いた方がすっきりすると思います。
そうなのですよね。今回は、「同じリストを参照している変数があることを前提に、リスト実体に対して中抜きを行なう」という目的でした。ですけど私用以外で使うなら「同じリストを参照している変数があること」を対応する仕様から切り捨てて、非破壊関数で実装した方が、improper-listに対応する仕様も組み込められますし、Lispのパラダイムとも合うでしょうね。
まぁ…何故中抜き関数/マクロがネット上に落ちていないかが、分からさせられます。
オフトピ。
"<"といちいち書き換えるのが対処法ですね。// …とコメントするためには"&lt;"と書くわけですが。個人設定のオプション>コメント投稿>標準のコメント投稿モードを‘ホントのtext形式’と変更した後でコメントすることでも解決策になるのかどうかは確かめたことない。
手っ取り早い話はhttp://books.google.co.jp/books?id=qQP5AAAAQBAJ&pg=PA92&lpg=PA... [google.co.jp]とか一次ソースとかで確認するなりマクロ置換をする入力フォームを自前で用意するなり。。。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生unstable -- あるハッカー
マクロにする必要って、ありますかね (スコア:1)
「Case 3: '(1)→'()だけどうにかならないか」を諦めちゃうのであれば、普通に関数で書いた方がすっきりすると思います。
あと、せっかくなのでimproper-listに対応しました。こんな感じです:
Case 4: (nakanuki! 2 '(1 2 3 . 4)) => '(1 2 . 4)
Case 5: (nakanuki! 0 '(1 . 2)) => 2
Case 6: (nakanuki! 1 '#1=(1 2 3 . #1#)) => '#1=(1 3 . #1#) ;; うーん。これは今ひとつかも。
(defun nakanuki! (idx lst)
"lisからidx番目を破壊的に取り除く"
(unless (= 0 idx)
(error "idxの値(%d)がヘンですー" idx))
(cond
((atom (cdr lst))
;; ↓互換性のために入れたけど、この1行は嫌だなぁ…
(setf (car lst) (cdr lst))
(cdr lst))
((= idx 0)
(setf (car lst) (cadr lst))
(nakanuki! 1 lst))
(t
(setf (cdr (nthcdr (1- idx) lst))
(nthcdr (1+ idx) lst))
lst)))
Re:マクロにする必要って、ありますかね (スコア:1)
(unless (<=
のミスですかね?"<"はタグ開始とみなされて投稿時に消えてしまうので
マクロにしたのは「Case 3 : '(1) -> '()」を一部でも対応するためです。
(let ((subs '(1))) ;; subs にリストを束縛
(nakanuki 0 subs) ;; => nil ;; subs[0] を 中抜く
subs) ;; => nil
仕様として一定ではないのは、やはりイマイチなのですが…
そうなのですよね。
今回は、「同じリストを参照している変数があることを前提に、リスト実体に対して中抜きを行なう」という目的でした。
ですけど私用以外で使うなら「同じリストを参照している変数があること」を対応する仕様から切り捨てて、
非破壊関数で実装した方が、improper-listに対応する仕様も組み込められますし、Lispのパラダイムとも合うでしょうね。
まぁ…何故中抜き関数/マクロがネット上に落ちていないかが、分からさせられます。
Re:マクロにする必要って、ありますかね (スコア:1)
オフトピ。
(unless (<=
のミスですかね?"<"はタグ開始とみなされて投稿時に消えてしまうので
"<"といちいち書き換えるのが対処法ですね。
// …とコメントするためには"&lt;"と書くわけですが。
個人設定のオプション>コメント投稿>標準のコメント投稿モードを‘ホントのtext形式’と
変更した後でコメントすることでも解決策になるのかどうかは確かめたことない。
手っ取り早い話はhttp://books.google.co.jp/books?id=qQP5AAAAQBAJ&pg=PA92&lpg=PA... [google.co.jp]
とか一次ソースとかで確認するなりマクロ置換をする入力フォームを自前で用意するなり。。。