标签: metaprogramming

在模板Haskell中的准引号里面的Typechecking

我正在努力熟悉Template Haskell,令我惊讶的是下面的代码编译ghc(版本6.10.4).


    main = do
       let
           y = [| "hello" + 1 |]
       putStr ""

这告诉我,准引号内没有类型检查.在阅读关于Template Haskell 的原始论文后,这不是我所期望的.而且以下程序不编译.


    main = do
       let
          y = [| "hello" && True |]
       putStr ""

这里发生了什么?

haskell types type-systems metaprogramming

20
推荐指数
2
解决办法
617
查看次数

如何获取通过attr_reader或attr_accessor定义的属性

假设我有一堂课 A

class A
  attr_accessor :x, :y

  def initialize(x,y)
    @x, @y = x, y
  end
end
Run Code Online (Sandbox Code Playgroud)

如何在不知道它们的确切名称的情况下获取xy归属.

例如

a = A.new(5,10)
a.attributes # => [5, 10]
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming

20
推荐指数
3
解决办法
3万
查看次数

使用包含类型提示的宏生成Clojure代码

我正在尝试使用类型提示生成一些Clojure代码,但是每当我构建一些代码时类型提示似乎都消失了(它们在代码编译时也不起作用)

例如

`(let [^BufferedImage b (create-buffered-image)] 
   (.getRGB b 0 0))

=> (clojure.core/let [user/b (user/create-buffered-image)] (.getRGB user/b 0 0))
Run Code Online (Sandbox Code Playgroud)

我不确定为什么类型提示正在消失,但我认为它与读者处理metatdata的方式有关.

在生成的代码中创建正确类型提示的正确方法是什么?

macros code-generation metaprogramming clojure type-hinting

20
推荐指数
1
解决办法
1588
查看次数

什么特质/概念可以保证memsetting一个对象是明确定义的?

假设我已经定义了一个zero_initialize()函数:

template<class T>
T zero_initialize()
{
    T result;
    std::memset(&result, 0, sizeof(result));
    return result;
}

// usage: auto data = zero_initialize<Data>();
Run Code Online (Sandbox Code Playgroud)

调用zero_initialize()某些类型会导致不确定的行为1,2.我目前正在执行T验证std::is_pod.由于这个特性在C++ 20中被弃用以及概念的出现,我很好奇zero_initialize()应该如何发展.

  1. 什么(最小)特征/概念可以保证memsetting一个对象是明确定义的?
  2. 我应该用std::uninitialized_fill而不是std::memset吗?为什么?
  3. 对于类型子集,此函数是否已被C++初始化语法之一淘汰?或者它将与即将到来的未来C++版本一起使用?

1) 删除班级的所有成员.
2) 在库类(std :: string)上使用memset时,"未定义的行为"是什么原因?[关闭]

c++ metaprogramming sfinae c++14 c++20

20
推荐指数
2
解决办法
959
查看次数

元编程 - 自解释代码 - 教程,文章,书籍

我正在研究改进我的编程技巧(实际上我每年都尽力减少吸收,就像我们的Jeff Atwood所说的那样),所以我正在考虑阅读有关元编程和自解释代码的内容.

我正在寻找类似白痴的指南(免费下载书籍,在线资源).此外,我想要的不仅仅是普通的wiki页面,还有一些语言不可知或最好是Java示例.

你是否知道有这样的资源可以有效地将所有这些资源付诸实践(我知道所有这些经验都有很多话要说但我有点想要建立避免流程错误决策 - 经验 - 良好决策的经验)?

编辑:

来自Pragmatic Programmer的这个例子的一些东西:

...实现一种迷你语言来控制一个简单的绘图包......该语言由单个字母命令组成.一些命令后跟一个数字.例如,以下输入将绘制一个矩形:

P 2 # select pen 2
D # pen down
W 2 # draw west 2cm
N 1 # then north 1
E 2 # then east 2
S 1 # then back south
U # pen up
Run Code Online (Sandbox Code Playgroud)

谢谢!

java coding-style metaprogramming

19
推荐指数
3
解决办法
4719
查看次数

如何列出Ruby类中包含的模块?

您如何列出Ruby中类层次结构中特定类中包含的模块?像这样的东西:

module SomeModule
end

class ParentModel < Object
  include SomeModule
end

class ChildModel < ParentModel
end

p ChildModel.included_modules #=> [SomeModule]
p ChildModel.included_modules(false) #=> []
Run Code Online (Sandbox Code Playgroud)

列出祖先会使模块在树中显得更高:

p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel]
Run Code Online (Sandbox Code Playgroud)

ruby module metaprogramming

19
推荐指数
1
解决办法
1万
查看次数

如何编写其逻辑受到保护以防止未来额外枚举的代码?

我很难描述这个问题.也许这就是为什么我很难找到一个好的解决方案(这些话只是不合作).让我通过代码解释:

// original code
enum Fruit
{ 
    Apple,
    Orange,
    Banana,
}

...

Fruit fruit = acquireFruit();
if (fruit != Fruit.Orange && fruit != Fruit.Banana)
    coreFruit();
else
    pealFruit();
eatFruit();
Run Code Online (Sandbox Code Playgroud)

现在假装多年的发展与这三种类型.上述逻辑的不同风格在存储过程,SSIS包,Windows应用程序,Web应用程序,Java应用程序,perl脚本等中传播....

最后:

// new code
enum Fruit
{ 
    Apple,
    Orange,
    Banana,
    Grape,
}
Run Code Online (Sandbox Code Playgroud)

大多数时候,"系统"运行正常,直到使用Grapes.然后,当不需要或不需要时,系统的某些部分会不恰当地起作用,剥离和/或取芯葡萄.

你坚持什么样的指导方针,以避免这些混乱?我的偏好是旧代码抛出异常,如果它没有被重构以考虑新的枚举.

我在黑暗中想出了一个镜头:

#1避免像这样"不在逻辑中"

// select fruit that needs to be cored
select Fruit from FruitBasket where FruitType not in(Orange, Banana)
Run Code Online (Sandbox Code Playgroud)

#2需要时使用精心构造的NotIn()方法

internal static class EnumSafetyExtensions
{
    /* By adding enums to these methods, you certify that 1.) ALL …
Run Code Online (Sandbox Code Playgroud)

c# metaprogramming

19
推荐指数
3
解决办法
779
查看次数

为什么使用两个sizeofs来检查一个类是否是默认可构造的,但是一个不是?

我使用了" 有没有办法测试C++类是否有默认构造函数(编译器提供的类型特征除外)? "的代码.

我稍微修改它以适应我的所有测试用例:

template< class T >
class is_default_constructible {
    typedef int yes;
    typedef char no;


    // the second version does not work
#if 1
    template<int x, int y> class is_equal {};
    template<int x> class is_equal<x,x> { typedef void type; };

    template< class U >
    static yes sfinae( typename is_equal< sizeof U(), sizeof U() >::type * );
#else
    template<int x> class is_okay { typedef void type; };

    template< class U >
    static yes sfinae( typename is_okay< sizeof U() >::type …
Run Code Online (Sandbox Code Playgroud)

c++ templates metaprogramming

19
推荐指数
1
解决办法
1005
查看次数

显式使用LambdaMetafactory

我正在尝试显式使用LambdaMetafactory.metafactory,我无法理解为什么它仅适用于Runnable功能接口.例如,此代码执行预期的操作(它打印"hello world"):

public class MetafactoryTest {

    public static void main(String[] args) throws Throwable {

        MethodHandles.Lookup caller = MethodHandles.lookup();
        MethodType methodType = MethodType.methodType(void.class);
        MethodType invokedType = MethodType.methodType(Runnable.class);
        CallSite site = LambdaMetafactory.metafactory(caller, 
                                                      "run", 
                                                      invokedType, 
                                                      methodType, 
                                                      caller.findStatic(MetafactoryTest.class, "print", methodType), 
                                                      methodType);
        MethodHandle factory = site.getTarget();
        Runnable r = (Runnable) factory.invoke();
        r.run();
    }

    private static void print() {
        System.out.println("hello world"); 
    }    
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用不同的功能界面时会出现问题,例如Supplier.以下代码不起作用:

public class MetafactoryTest {

    public static void main(String[] args) throws Throwable {

        MethodHandles.Lookup caller = MethodHandles.lookup();
        MethodType methodType = MethodType.methodType(String.class);
        MethodType invokedType …
Run Code Online (Sandbox Code Playgroud)

java lambda metaprogramming java-8

19
推荐指数
1
解决办法
6161
查看次数

1个类继承了2个不同的元类(abcmeta和用户定义的元)

我有一个class1需要继承2个不同的元类,即Meta1和abc.ABCMeta

目前的实施:

Meta1的实现:

class Meta1(type):
    def __new__(cls, classname, parent, attr):
        new_class = type.__new__(cls, classname, parent, attr)
        return super(Meta1, cls).__new__(cls, classname, parent, attr)
Run Code Online (Sandbox Code Playgroud)

class1Abstract的实现

class class1Abstract(object):
    __metaclass__ = Meta1
    __metaclass__ = abc.ABCMeta
Run Code Online (Sandbox Code Playgroud)

mainclass的实现

class mainClass(class1Abstract):
    # do abstract method stuff
Run Code Online (Sandbox Code Playgroud)

我知道两次实现两个不同的元是错误的.

我改变了加载metclass的方式(几次尝试),我得到了这个TypeError:调用元类库时出错

metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Run Code Online (Sandbox Code Playgroud)

我的想法用完了......


EDITED 1

我尝试了这个解决方案,但是mainClass不是class1Abstract的一个实例

print issubclass(mainClass, class1Abstract) # true
print isinstance(mainClass, class1Abstract) # false
Run Code Online (Sandbox Code Playgroud)

class1Abstract的实现

class TestMeta(Meta1):
    pass


class …
Run Code Online (Sandbox Code Playgroud)

python metaprogramming metaclass

19
推荐指数
2
解决办法
4840
查看次数