7

私は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))
4

6 に答える 6

23

を使用setfnthて、値をインデックスで置き換えたり取得したりできます。

(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)

私はこれらすべてをこの関数のインデックスで見つけました。

于 2008-09-05T04:33:41.173 に答える
11
  1. リストから何かのインデックスを見つけます。

EmacsLispとCommonLispには、次のposition機能があります。

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

Schemeでは、DrSchemeのドキュメントからの末尾再帰の実装は次のとおりです。

(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
> 

しかし、構造化データを格納するためのスロットのコレクションとしてリストを使用している場合は、defstructCLOSのようなLispObjectSystemを確認する必要があります。

Lispを学んでいる場合は、PracticalCommonLispおよび/またはTheLittleSchemerを確認してください。

乾杯!

于 2008-09-10T12:51:06.053 に答える
7

回答:

  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はリストだけでなく任意のシーケンスで機能するため、n番目よりもeltの方が適しています。

于 2008-09-15T14:49:32.810 に答える
4

ジェレミーの答えはうまくいくはずです。とはいえ、次のようなコードを書いていることに気付いたら

(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))
于 2008-09-05T12:32:51.223 に答える
4

「Practical Common Lisp」の場合は+2 。これは、Common Lisp Cookbook と質の高い Teach Yourself Lisp ブックの混合物です。

また、「Successful 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」も読んだことがあります。これは、言語の基本について説明したものですが、リファレンス マニュアルのようなものです。

于 2008-09-15T20:27:11.220 に答える
0

私はトーマスに同意しなければなりません。配列のようなリストを使用する場合、それは遅くなります(そしておそらく厄介です)。したがって、配列を使用するか、作成した関数をそのまま使用する必要がありますが、後でスローリストを配列に簡単に置き換えることができるように、配列を「上」に移動します。

于 2008-09-10T12:26:04.817 に答える