小编use*_*983的帖子

Perl:匿名子程序中的原型

我目前正在学习有关类型和名称空间的Perls系统.所以我写了一个模块,它接受一个常量的值和名称两个参数,并将常量输出到调用者.$ package变量等于caller [2].

*{"$package::$name"} = sub () { return $value; };
Run Code Online (Sandbox Code Playgroud)

上面的代码完成了将匿名子例程导出到调用者符号表中的工作.因为我的目标是构建我自己的常量实现,子例程有一个空原型,这意味着它是一个只读子程序.

但这是我的问题:原型不起作用.所以

print &TestConst; #works well
print TestConst(); #works well
print TestConst; #Name "main::TestConst" used only once: possible typo at testscript.pl line 7.
Run Code Online (Sandbox Code Playgroud)

我的想法有什么问题吗?还有另一种方法吗?

perl prototype namespaces typeglob perl5

8
推荐指数
1
解决办法
251
查看次数

Perl/XS 中的面向过程和面向对象的接口

我目前正在编写我的第一个 XS 模块(只是一个围绕 C 数学库的包装器),并取得了不错的成功。最大的问题是文档很难理解和/或不完整。

我已经成功地在 XS 中编写了一个构造函数,并从库中实现了一些函数作为方法调用。这很好用。

现在我也想实现一个程序接口。出于这个原因,我需要知道它是否是方法调用。如果它是一个方法调用,用函数计算的数字存储在实例中,如果它是对函数的过程调用,它的数字作为第一个参数给出。这是余弦函数的当前代码:

double
cos(...)
    CODE:
        SV *arg = newSVsv(ST(0));
        if (sv_isobject(arg)) {
            HV *self_hv = MUTABLE_HV(SvRV(arg));
            SV **callback_ptr = hv_fetchs(self_hv, "Number", 0);
            SV *zahl = *callback_ptr;
        }
        else {
            SV *zahl = newSVnv(arg);
        }

        double x = SvNV(zahl);
        RETVAL = cos(x);
    OUTPUT:
        RETVAL
Run Code Online (Sandbox Code Playgroud)

perl xs

3
推荐指数
1
解决办法
219
查看次数

标签 统计

perl ×2

namespaces ×1

perl5 ×1

prototype ×1

typeglob ×1

xs ×1