質問

私は Lisp の次の機能をどこでも探しましたが、どこにも見つかりませんでした。

  1. リスト内の何かのインデックスを見つけます。例:

    (index-of item InThisList)
    
  2. リスト内の特定の場所にあるものを置き換えます。例:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'?
    
  3. 特定のインデックスにある項目を返します。例:

    (return InThisList ItemAtThisIndex)
    

ここまでは独自の関数でごまかしていました。自分のためにもっと作品を作っているだけなのかなと思っています。

これが私がナンバー1を偽る方法です:

(defun my-index (findMe mylist)
  (let ((counter 0) (found 1))
    (dolist (item mylist)
      (cond
        ((eq item findMe) ;this works because 'eq' checks place in memory, 
                  ;and as long as 'findMe' was from the original list, this will work.
         (setq found nil)
        (found (incf counter))))
  counter))
役に立ちましたか?

解決

使用できます setf そして nth インデックスによって値を置換および取得します。

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101); <----
     myList)

(1 2 3 4 101 6)

インデックスで検索するには、次を使用できます position 関数.

(let ((myList '(1 2 3 4 5 6)))
     (setf (nth 4 myList) 101)
     (list myList (position 101 myList)))

((1 2 3 4 101 6) 4)

これらすべてを見つけました この関数の索引では.

他のヒント

  1. リスト内の何かのインデックスを見つけます。

Emacs Lisp と Common Lisp には、 position 関数:

> (setq numbers (list 1 2 3 4))
(1 2 3 4)
> (position 3 numbers)
2

Scheme では、以下の末尾再帰実装があります。 ドクタースキームのドキュメント:

(define list-position 
  (lambda (o l)
    (let loop ((i 0) (l l))
      (if (null? l) #f
          (if (eqv? (car l) o) i
              (loop (+ i 1) (cdr l)))))))

----------------------------------------------------

> (define numbers (list 1 2 3 4))
> (list-position 3 numbers)
2
> 

ただし、構造化データを保存するためのスロットのコレクションとしてリストを使用している場合は、おそらく以下を参照する必要があります。 defstruct あるいはCLOSのようなある種のLispオブジェクトシステムさえも。

Lisp を学習している場合は、必ず見てください。 実用的な Common Lisp および/または 小さな策士.

乾杯!

答え:

  1. (位置項目シーケンス &key from-end (start 0) end key test test-not)
    http://lispdoc.com/?q=position&search=Basic+search

  2. (setf(eltシーケンスインデックス)値)

  3. (elt シーケンス インデックス)
    http://lispdoc.com/?q=elt&search=Basic+search
    注記:elt はリストだけでなくあらゆるシーケンスに対して機能するため、nth よりも elt の方が望ましいです。

Jeremy の答えは機能するはずです。とはいえ、次のようなコードを書いていることに気付いたら、

(setf (nth i my-list) new-elt)

おそらく間違ったデータ構造を使用していると思われます。リストは単なるリンクされたリストであるため、インデックスによるアクセスは O(N) です。配列を使用した方が良いかもしれません。

あるいは、リストをタプルとして使用している可能性があります。その場合は大丈夫なはずです。しかし、コードを読む人が「nth 4」が何を意味するのかを覚えておく必要がないように、アクセサーに名前を付けたいと思うかもしれません。何かのようなもの

(defun my-attr (list)
  (nth 4 list))

(defun (setf my-attr) (new list)
  (setf (nth 4 list) new))

+2 「実用的な Common Lisp」用。これは Common Lisp Cookbook と質の高い Teach Yourself Lisp 本を組み合わせたものです。

「成功した Common Lisp」もあります (http://www.psg.com/~dlamkins/sl/cover.html そして http://www.psg.com/~dlamkins/sl/contents.html)これは、「Practical Common Lisp」のいくつかのギャップを埋めたり拡張したりするように見えました。

また、Paul Graham の「ANSI Common Lisp」も読みました。これは言語の基本に関するものですが、リファレンス マニュアルに近いものです。

私もトーマスの意見に同意せざるを得ない。配列のようなリストを使用すると、速度が遅くなるだけです (おそらく扱いにくくなります)。したがって、配列を使用するか、作成した関数をそのまま使用して、後から遅いリストを簡単に配列に置き換えることができるように関数を「上」に移動する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top