LETとSETQの違いは?

ビジェイ・ラジャンナ

私はGCLを使用してUbuntuでプログラミングしています。さまざまなソースからのCommonLispに関するドキュメントから、ローカル変数let作成し既存の変数の値を設定することを理解しています。以下の場合、2つの変数を作成し、それらの値を合計する必要があります。setq

使用する setq

(defun add_using_setq ()
  (setq a 3)  ; a never existed before , but still I'm able to assign value, what is its scope?
  (setq b 4)  ; b never existed before, but still I'm able to assign value, what is its scope?
  (+ a b))

使用する let

(defun add_using_let ( )
  (let ((x 3) (y 4)) ; creating variables x and y
     (+ x y)))

どちらの場合も、私は同じ結果を達成しているようです。使用setqletここの違いは何ですか?使用するsetq必要のあるすべての場所で(構文的に簡単なため)使用できないのはなぜletですか?

ジョシュア・テイラー

setq 変数に値を割り当てますが、let新しい変数/バインディングを導入します。たとえば、何が起こるか見てください

(let ((x 3))
  (print x)      ; a
  (let ((x 89))
    (print x)    ; b
    (setq x 73)  
    (print x))   ; c
  (print x))     ; d


3   ; a
89  ; b
73  ; c
3   ; d

外側letはローカル変数を作成しx、内側let内側の変数をシャドウイングする別のローカル変数を作成します。let変数をシャドウイングするために使用しても、シャドウイングされた変数の値には影響しないことに注意してくださいxライン内をdれるxアウターによって導入されlet、その値は変更されていません。setq呼び出される変数にのみ影響します。この例はsetq、ローカル変数で使用されることを示していますが、特別な変数(つまり、動的にスコープされ、通常はdefparameterまたはdefvar:で定義される)で使用することもできます

CL-USER> (defparameter *foo* 34)
*FOO*
CL-USER> (setq *foo* 93)
93
CL-USER> *foo*
93

setq(移植性)はありません作成した変数を、一方でletdefvardefparameter、&​​C。行う。setq(まだ)変数ではない引数で呼び出されたときの動作は定義されておらず、何をするかを決定するのは実装次第です。たとえば、SBCLは大声で不平を言います:

CL-USER> (setq new-x 89)

; in: SETQ NEW-X
;     (SETQ NEW-X 89)
; 
; caught WARNING:
;   undefined variable: NEW-X
; 
; compilation unit finished
;   Undefined variable:
;     NEW-X
;   caught 1 WARNING condition
89

もちろん、これらの概念をよりよく理解するための最良の方法は、より多くのLispコード(時間とともに付属)を読み書きし、HyperSpecのエントリを読み取り、相互参照、特に用語集のエントリに従うことです。例えば、HyperSpecからの短い説明のためsetqlet、次のとおりです。

  • SETQ

    変数に値を割り当てます

  • LET

    letおよびlet *は、新しい変数バインディング作成し、これらのバインディングを使用する一連のフォームを実行します。

変数とバインディングについてもっと読みたいと思うかもしれません。letそしてlet*また動的変数として、いくつかの特殊な動作持ってspecial宣言を(しかし、あなたはおそらくしばらくの間、それについて知っておく必要はありません)、および特定のケースでは(おそらくしばらくについて知る必要がないということ)する場合、変数は実際には変数ではなく、実際にsetqはと同等setfです。HyperSpecに詳細があります。

Stack Overflowには、まったく重複していない質問がいくつかありますが、それでも、CommonLispで使用できるさまざまな変数定義および代入演算子の使用法を理解するのに役立つ場合があります。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

EmacsLispのsetqとsetq-defaultの違い

分類Dev

CommonLispの `set`、` setq`、 `setf`の違いは?

分類Dev

varとletの違い

分類Dev

javascriptのvar [{}]とvar {}とtypescriptのlet [{}]とlet {}の違いは何ですか?

分類Dev

Typescriptのvarとletの違いは何ですか?

分類Dev

Typescriptのvarとletの違いは何ですか?

分類Dev

OCamlのlet-bindingsとreferencesの違いは何ですか?

分類Dev

Swiftの `ifvar`と` if let`の違いは何ですか?

分類Dev

JavaScriptの「let」と「this」の違いは何ですか?

分類Dev

let f:F = f`と `let f = <F> f`の違いは何ですか

分類Dev

let-item = "item"とlet-item $ = "item $"の違いは何ですか?

分類Dev

'let'と 'const' ECMAScript 2015(ES6)の違いは何ですか?

分類Dev

「let」と「var」の違いは何ですか?

分類Dev

Vim:letとsetの違いは何ですか?

分類Dev

Chromeコンソール:「let」と「var」の違いは?

分類Dev

ifとifの主な違い-Rustのlet

分類Dev

let、expr、$ []の違い

分類Dev

'と "の違いは?

分類Dev

let-rebindingと標準の割り当ての違いは何ですか?

分類Dev

Haskellモナドの `let .. indo`と` <-`表記の違いは何ですか?

分類Dev

beginのswitchcaseと()で `let`を使用する場合の違いは何ですか

分類Dev

複数変数定義のletとvarの違いは何ですか?

分類Dev

VIM:let g:、let b:などの違いは何ですか?

分類Dev

F#での `let f = fun a-> a-1`と` let fa = a-1`の違い

分類Dev

Javaの&と&&の違いは?

分類Dev

Rubyの「and」と&&の違いは?

分類Dev

XPathの「//」と「/」の違いは?

分類Dev

XPathの「//」と「/」の違いは?

分類Dev

Scalaの&と&&の違いは?

Related 関連記事

  1. 1

    EmacsLispのsetqとsetq-defaultの違い

  2. 2

    CommonLispの `set`、` setq`、 `setf`の違いは?

  3. 3

    varとletの違い

  4. 4

    javascriptのvar [{}]とvar {}とtypescriptのlet [{}]とlet {}の違いは何ですか?

  5. 5

    Typescriptのvarとletの違いは何ですか?

  6. 6

    Typescriptのvarとletの違いは何ですか?

  7. 7

    OCamlのlet-bindingsとreferencesの違いは何ですか?

  8. 8

    Swiftの `ifvar`と` if let`の違いは何ですか?

  9. 9

    JavaScriptの「let」と「this」の違いは何ですか?

  10. 10

    let f:F = f`と `let f = <F> f`の違いは何ですか

  11. 11

    let-item = "item"とlet-item $ = "item $"の違いは何ですか?

  12. 12

    'let'と 'const' ECMAScript 2015(ES6)の違いは何ですか?

  13. 13

    「let」と「var」の違いは何ですか?

  14. 14

    Vim:letとsetの違いは何ですか?

  15. 15

    Chromeコンソール:「let」と「var」の違いは?

  16. 16

    ifとifの主な違い-Rustのlet

  17. 17

    let、expr、$ []の違い

  18. 18

    'と "の違いは?

  19. 19

    let-rebindingと標準の割り当ての違いは何ですか?

  20. 20

    Haskellモナドの `let .. indo`と` <-`表記の違いは何ですか?

  21. 21

    beginのswitchcaseと()で `let`を使用する場合の違いは何ですか

  22. 22

    複数変数定義のletとvarの違いは何ですか?

  23. 23

    VIM:let g:、let b:などの違いは何ですか?

  24. 24

    F#での `let f = fun a-> a-1`と` let fa = a-1`の違い

  25. 25

    Javaの&と&&の違いは?

  26. 26

    Rubyの「and」と&&の違いは?

  27. 27

    XPathの「//」と「/」の違いは?

  28. 28

    XPathの「//」と「/」の違いは?

  29. 29

    Scalaの&と&&の違いは?

ホットタグ

アーカイブ