Perl 6 docsには複数の種類のリストがあります。 Str
のような一部のものは、より複雑なボックス/ボックス解除動作を持っています。Perl 6 NativeCall構造体のユーザーモードタイプを追加する
自分のタイプを定義して、ボックス/アンボックスに自分のルーチンを指定することはできますか?特定のプロジェクトでは、私は再利用しているタイプの束を持っており、基本的にはアクセサの機能を何度も切り取って貼り付けています。
たとえば、C Structはtime_t
を使用し、アクセッサーメソッドをプラグインしてDateTime
に/からアクセスします。もう1つの例はコンマで区切られたリストです。私はArray
に/から行き、split
/join
を自動的に処理したいと思います。
これを行うより良い方法はありますか?
編集:例を追加します。
constant time_t = uint64;
constant FooType_t = uint16;
enum FooType <A B C>;
class Foo is repr('CStruct') is rw
{
has uint32 $.id;
has Str $.name;
has FooType_t $.type;
has time_t $.time;
method name(Str $n?) {
$!name := $n with $n;
$!name;
}
method type(FooType $t?) {
$!type = $t with $t;
FooType($!type);
}
method time(DateTime $d?) {
$!time = .Instant.to-posix[0].Int with $d;
DateTime.new($!time)
}
}
my $f = Foo.new;
$f.id = 12;
$f.name('myname');
$f.type(B);
$f.time(DateTime.new('2000-01-01T12:34:56Z'));
say "$f.id() $f.name() $f.type() $f.time()";
# 12 myname B 2000-01-01T12:34:56Z
これは動作しますが、私は、Perlっぽいな方法で(何の左辺値を、私はそれらをパラメータとして渡すことができます)CStruct
の様々なフィールドを設定することはできません。
今度は、たくさんの構造体の多くのフィールドにtime_t
、FooType_t
などを使用して、同じように動作させたいと思います。これらのメソッドを何度も繰り返しコピーする以外の方法がありますか?
多分マクロがここに役立つでしょうか?私はまだそれらを習得していない。
メモリ管理はなり私がこれにいくらか近づくにつれて挑戦的です。 CStructを非常に素早く扱い、スマートなクラスを上に重ねるのが最も良いでしょう。 –
ところで:私はNativeCallが大好きです。 Cライブラリとのインターフェイスがいかに簡単かは驚くべきことです。 –