AutoLISPを使ってると、よく出てくるこの2つの関数──SETQ
とSET
。
「どっち使えばいいの?」「何が違うの?」って思ったこと、ありませんか?
今回はこの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の世界では欠かせない存在です。
コメント