Lispクロージャーを使用して作成されたカウンターをコピーするにはどうすればよいですか?

johnsondavies

Lispクロージャの典型的な例は、カウンターを返す次の関数です。

(defun make-up-counter ()
  (let ((n 0))
    #'(lambda () (incf n))))

呼び出されると、カウントがインクリメントされ、結果が返されます。

CL-USER > (setq up1 (make-up-counter))
#<Closure 1 subfunction of MAKE-UP-COUNTER 20099D9A>

CL-USER > (funcall up1)
1

CL-USER > (funcall up1)
2

Lispに慣れていない友人にこれを見せたとき、彼はカウンターをコピーして同じタイプの新しい独立したカウンターを作成する方法を私に尋ねました。これは機能しません:

CL-USER > (setq up2 up1)
#<Closure 1 subfunction of MAKE-UP-COUNTER 20099D9A>

up2は新しいカウンターではないため、同じカウンターの名前が異なるだけです。

CL-USER > (funcall up2)
3

これが私の最善の試みです:

(defun make-up-counter ()
  (let ((n 0))
    #'(lambda (&optional copy)
        (if (null copy)
            (incf n)
          (let ((n 0))
            #'(lambda () (incf n)))))))

カウンターのコピーを返すには、引数tを指定して呼び出します。

(defun copy-counter (counter) (funcall counter t))

これは、第1世代のコピーで機能します。

CL-USER > (setq up2 (copy-counter up1))
#<Closure 1 subfunction of MAKE-UP-COUNTER 200DB722>

CL-USER > (funcall up2)
1

しかし、up2をコピーしようとすると、明らかに機能しません。メイクアップカウンターの定義には、それ自体の定義内にそれ自体のコピーが必要であるため、正しく機能させる方法がわかりません。

助言がありますか?

クリスジェスター-若い

これを解決するには、次を使用して再帰関数を使用する必要がありますlabels

(defun make-up-counter ()
  (labels ((new ()
             (let ((n 0))
               (lambda (&optional copy)
                 (if copy
                     (new)
                     (incf n))))))
    (new)))

copytrueの場合、現在のカウンター値をコピーするようにすることもできます。

(defun make-up-counter ()
  (labels ((new (n)
             (lambda (&optional copy)
               (if copy
                   (new n)
                   (incf n)))))
    (new 0)))

両方のcopy長所を生かすために、が数値の場合指定された値でカウンターを作成することができます。それ以外の場合は、正しければカウンター値をコピーし、そうでない場合はインクリメントします。

(defun make-up-counter ()
  (labels ((new (n)
             (lambda (&optional copy)
               (cond ((numberp copy) (new copy))
                     (copy (new n))
                     (t (incf n))))))
    (new 0)))

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ボタンが押された回数を表示するTkinterを使用してカウンターを作成するにはどうすればよいですか?

分類Dev

クロージャを使用して、データがロードされたときにのみ完了するにはどうすればよいですか?(迅速)

分類Dev

スタックを使用して、グローバルに使用するためにローカルで作成されたHaskellモジュールをインストールするにはどうすればよいですか?

分類Dev

クライアントが戻るボタンを押してページにアクセスしたときに、キャッシュされたコピーではなく新しいコピーをロードするようにするにはどうすればよいですか?

分類Dev

Javaスクリプトを使用してユーザーがWebページをリロードした回数を確認するためのカウンターを作成するにはどうすればよいですか?

分類Dev

Spring Data Elasticsearchを使用してローカルに作成されたESクラスターに接続するにはどうすればよいですか?

分類Dev

ダウンロード中にTeamViewerを使用してコンピュータにアクセスするにはどうすればよいですか?

分類Dev

CSpinButtonCtrlクラスを使用してMFCでスピンボタンコントロールを動的に作成するにはどうすればよいですか?

分類Dev

githubブログでマークダウンを使用してフローチャートを作成するにはどうすればよいですか?

分類Dev

groovyを使用してコンピューターに保存された不明な.jsonから「キー」を取得するにはどうすればよいですか?

分類Dev

クロージャが作成された関数を特定するにはどうすればよいですか?

分類Dev

チタン合金を使用してコントローラーでピッカー値を取得するにはどうすればよいですか?

分類Dev

SASでPROCGHARTを使用して、クラスター化されたチャートを並べて作成するにはどうすればよいですか?

分類Dev

スクリプトを使用してアーカイブをダウンロードおよび抽出するにはどうすればよいですか(後続のコマンドにダウンロードされたファイルを確実に指定するにはどうすればよいですか)。

分類Dev

swiftを使用してページコントロールでスクロールビューを作成するにはどうすればよいですか?

分類Dev

MySQLでカウンターを使用してスケジューラーを作成するにはどうすればよいですか?

分類Dev

Amazon EC2コンピューターを使用してElasticsearchクラスターを作成するにはどうすればよいですか?

分類Dev

Firefox Syncアカウントを使用してコンピューターを管理するにはどうすればよいですか?

分類Dev

C#プロセスを使用して新しいコマンドラインウィンドウを開かずに、「schtasks」でスケジュールされたタスクを実行するにはどうすればよいですか?

分類Dev

grepでキャプチャされたフィールドを使用してコマンドを作成するにはどうすればよいですか?

分類Dev

OCamlクロージャーをコピーするにはどうすればよいですか?

分類Dev

カルタゴを使用して作成されたフレームワークを最新のxcodeバージョンで再コンパイルするにはどうすればよいですか?

分類Dev

ランチャーアイコンにカーソルを合わせてスクロールしたときに、Unity 7がウィンドウにフォーカスしないようにするにはどうすればよいですか?

分類Dev

ダウンロードが停止されたGitリポジトリのクローンを作成し続けるにはどうすればよいですか?

分類Dev

ローカルネットワークを介して別のコンピューターからコンピューターをリモートで使用するにはどうすればよいですか?

分類Dev

Ubuntuターミナルからローカルホストで実行されているハイパーレジャーコンポーザープレイグラウンドを停止するにはどうすればよいですか?

分類Dev

変数を使用してプロシージャを作成するにはどうすればよいですか?

分類Dev

Pythonでモデルを作成した後、モデルを保存して、コンピューターをシャットダウンして翌日作業できるようにするにはどうすればよいですか?

分類Dev

ループカウンターを使用して、オブジェクトを動的に作成し、そのカウンターを使用してオブジェクトに名前を付けるにはどうすればよいですか?

Related 関連記事

  1. 1

    ボタンが押された回数を表示するTkinterを使用してカウンターを作成するにはどうすればよいですか?

  2. 2

    クロージャを使用して、データがロードされたときにのみ完了するにはどうすればよいですか?(迅速)

  3. 3

    スタックを使用して、グローバルに使用するためにローカルで作成されたHaskellモジュールをインストールするにはどうすればよいですか?

  4. 4

    クライアントが戻るボタンを押してページにアクセスしたときに、キャッシュされたコピーではなく新しいコピーをロードするようにするにはどうすればよいですか?

  5. 5

    Javaスクリプトを使用してユーザーがWebページをリロードした回数を確認するためのカウンターを作成するにはどうすればよいですか?

  6. 6

    Spring Data Elasticsearchを使用してローカルに作成されたESクラスターに接続するにはどうすればよいですか?

  7. 7

    ダウンロード中にTeamViewerを使用してコンピュータにアクセスするにはどうすればよいですか?

  8. 8

    CSpinButtonCtrlクラスを使用してMFCでスピンボタンコントロールを動的に作成するにはどうすればよいですか?

  9. 9

    githubブログでマークダウンを使用してフローチャートを作成するにはどうすればよいですか?

  10. 10

    groovyを使用してコンピューターに保存された不明な.jsonから「キー」を取得するにはどうすればよいですか?

  11. 11

    クロージャが作成された関数を特定するにはどうすればよいですか?

  12. 12

    チタン合金を使用してコントローラーでピッカー値を取得するにはどうすればよいですか?

  13. 13

    SASでPROCGHARTを使用して、クラスター化されたチャートを並べて作成するにはどうすればよいですか?

  14. 14

    スクリプトを使用してアーカイブをダウンロードおよび抽出するにはどうすればよいですか(後続のコマンドにダウンロードされたファイルを確実に指定するにはどうすればよいですか)。

  15. 15

    swiftを使用してページコントロールでスクロールビューを作成するにはどうすればよいですか?

  16. 16

    MySQLでカウンターを使用してスケジューラーを作成するにはどうすればよいですか?

  17. 17

    Amazon EC2コンピューターを使用してElasticsearchクラスターを作成するにはどうすればよいですか?

  18. 18

    Firefox Syncアカウントを使用してコンピューターを管理するにはどうすればよいですか?

  19. 19

    C#プロセスを使用して新しいコマンドラインウィンドウを開かずに、「schtasks」でスケジュールされたタスクを実行するにはどうすればよいですか?

  20. 20

    grepでキャプチャされたフィールドを使用してコマンドを作成するにはどうすればよいですか?

  21. 21

    OCamlクロージャーをコピーするにはどうすればよいですか?

  22. 22

    カルタゴを使用して作成されたフレームワークを最新のxcodeバージョンで再コンパイルするにはどうすればよいですか?

  23. 23

    ランチャーアイコンにカーソルを合わせてスクロールしたときに、Unity 7がウィンドウにフォーカスしないようにするにはどうすればよいですか?

  24. 24

    ダウンロードが停止されたGitリポジトリのクローンを作成し続けるにはどうすればよいですか?

  25. 25

    ローカルネットワークを介して別のコンピューターからコンピューターをリモートで使用するにはどうすればよいですか?

  26. 26

    Ubuntuターミナルからローカルホストで実行されているハイパーレジャーコンポーザープレイグラウンドを停止するにはどうすればよいですか?

  27. 27

    変数を使用してプロシージャを作成するにはどうすればよいですか?

  28. 28

    Pythonでモデルを作成した後、モデルを保存して、コンピューターをシャットダウンして翌日作業できるようにするにはどうすればよいですか?

  29. 29

    ループカウンターを使用して、オブジェクトを動的に作成し、そのカウンターを使用してオブジェクトに名前を付けるにはどうすればよいですか?

ホットタグ

アーカイブ