(import (rnrs) (srfi :123)) (define l (list (list 1) 2 3)) ;; Must not a literal list :) (ref 1 0) ;; -> (1) (ref* l 0 0) ;; -> 1 ;; ~ is an alias of ref* (~ l 0 0) ;; -> 1 (set! (ref l 1) 4) (ref l 1) ;; -> 4 (set! (ref* l 0 0) 5) (ref* l 0 0) ;; -> 5

ref

ref*

ref

list-ref

set!

(set! (ref l 1) 4) (set! (ref* l 0 0) 5)

((setter ref) l 1 4) ((setter ref*) l 0 0 5)

(ref* 1 0 0)

この記事は Lisp SETF Advent Calendar 2018 二日目の為に書かれました。0x25歳になって最初に書く記事です(実際には投稿予約の機能を使っているので数日若いが…)。いい感じの区切りの歳の最初の記事としてはイマイチな題材かもしれないなぁとも思いつつ… SRFI 123: Generic accessor and modifier operators は Taylan Ulrich Bayırlı/Kammer によって提唱された Gauche 風の総称アクセサを提供する SRFI です。取りあえず簡単な例を見てこれの何が嬉しいのかというのを確認してみましょう。こんな感じです。上記の例ではリストを使っていますが、その他のデータ又はレコード型でも似たような感じで動作します。基本的には又はが適切なデータへのアクセス手続きに変換すると思えば良いです。上記の例ならば、に変換しています。 SRFI-17 を利用して実現しています。例えば以下のコードは、それぞれこのように変換されますちなみに、SRFI-17 については LISP Library 365 で書いた SRFI-17の紹介 を参照するといいかもしれません。余談この SRFI の ポータブルな実装 を覗くと、もの凄く頑張って色々なデータ型のサポートをしているのが見て取れます。この頑張りは総称函数があれば不用だろうなぁいう感じがするので、この SRFI の前に総称函数の SRFI があればよかったのではとも思ったりします(もしくは、Tiny CLOS を使って実装するとか？)。追記を修正(1:数字の一 -> l:小文字のL)