【AutoLISP講座】SETとSETQの違い。やさしく解説


AutoLISPを使ってると、よく出てくるこの2つの関数──SETQSET
「どっち使えばいいの?」「何が違うの?」って思ったこと、ありませんか?

今回はこの2つの違いを、やさしく・わかりやすく・ちょっと遊び心を交えて解説します!


🧪 SETQってなに?

まずは王道の SETQ から。これは「Set Quoted」の略で、変数に値を代入するための基本関数です。

(setq a 10)

このコードは、「aという変数に10を入れてね」っていう命令。
左側の a は評価されず、文字通り「a」という名前の変数に代入されます。

AutoLISP界では、SETQは「おにぎりの具を直接入れる」ような感覚。シンプルで分かりやすい!


🧪 SETってなに?

さて、ちょっとクセ者なのが SET。これは左辺を評価して、その結果のシンボルに値を代入する関数です。

(setq var 'a)
(set var 20)

この場合、var には 'a(シンボルa)が入ってるので、SETは「aに20を代入する」って動きになります。

つまり、SETは「変数名を変数で指定する」ことができるんです。
ラボたろう的には、「おにぎりの具を、具の名前を書いた紙を見て入れる」みたいな感じ。


🧪 実例:動的に変数名を作って代入する

SETの真骨頂はここ!
たとえば、ユーザーから複数のポイントを取得して、それぞれを point_1, point_2, point_3…って名前で保存したいとき。

(setq j 1)
(while (set (read (strcat "point_" (itoa j))) (getpoint "\nPoint : ")) 
  (setq j (1+ j))
)

このコード、ちょっと魔法みたいでしょ?
SETを使うことで、文字列から変数名を生成して代入できちゃうんです。


🧪 応用:ポイントをY座標でソートして線を描く

記事ではさらに、取得したポイントをY座標でソートして、順番に線を描くルーチンも紹介されてました。

(command "_line")
(mapcar 'command lpt)

このあたりは、AutoLISPの「ちょっと上級者向け」なテクニック。
でも、SETとSETQの違いを理解していれば、ちゃんとついていけますよ!


🧪 まとめ:SETQとSETの使い分け

関数左辺の評価使いどころ
SETQ評価しない普通の代入。基本はこっち!
SET評価する動的な変数名を使いたいとき

SETQは「素直でまじめな子」。SETは「ちょっとひねりの効いた自由人」。
どちらもAutoLISPの世界では欠かせない存在です。

コメント

タイトルとURLをコピーしました