标签: ctfe

D CTFE和GPU代码生成

可D的混入用于映射线性代数运算,以任一/二者 CPU代码和OpenCL或GPU顶点着色器功能,诸如GLSL?对于D和更好的桥接逻辑,这将成为CPU和GPU执行的真正杀手级应用.将其与glm和D的gl3n进行比较,后者只是将固定大小的线性代数编译为CPU代码.

VexCL是使用OpenCL和C++ 11(GCC 4.6或更高版本)的概念证明,它完全抽象出与内存分配有关的后端依赖(CPU/GPU)实现细节以及与C++ AMP有些类似的代码执行.所以事情只能在D中变得更好吗?mixin能否完全取代VexCL中使用的C++表达式模板?这是一个很好的教程.

CTFE也可能在此讨论中发挥作用.

d glsl mixins opencl ctfe

6
推荐指数
1
解决办法
247
查看次数

D特征 - 完整数据成员列表

我试图使用以下代码从类中获取整数数据成员的列表:

import std.stdio;
import std.traits;

class D
{
    static string[] integralMembers = getIntegralMembers();

    static string[] getIntegralMembers()
    {
        auto allMembers = __traits(allMembers, D);

        string[] tmp = new string[allMembers.length];
        int ct = 0;

        for(int i = 0; i != allMembers.length; ++i) {
            bool isInteg = __traits(isIntegral, __traits(getMember, D, allMembers[i]));
            if(isInteg) {
                tmp[ct++] = allMembers[i];
            }
        }

        string[] ret = new string[ct];

        for(int i = 0; i != ct; ++i) {
            ret[i] = tmp[i];
        }

        return ret;
    }

    int a;
    this() { } …
Run Code Online (Sandbox Code Playgroud)

d type-traits ctfe

5
推荐指数
1
解决办法
189
查看次数

从数组中定义的文件名导入内容

我可以import在编译期间连接读取的文件,如下所示:

enum string a = import("a.txt");
enum string b = import("b.txt");
enum string result = a ~ b;
Run Code Online (Sandbox Code Playgroud)

result如果我在数组中有文件名,我怎么能得到连接?

enum files = ["a.txt", "b.txt"];
string result;
foreach (f; files) {
  result ~= import(f);
}
Run Code Online (Sandbox Code Playgroud)

此代码返回错误Error: variable f cannot be read at compile time.

功能方法似乎也不起作用:

enum files = ["a.txt", "b.txt"];
enum result = reduce!((a, b) => a ~ import(b))("", files);
Run Code Online (Sandbox Code Playgroud)

它返回相同的错误: Error: variable b cannot be read at compile time

d ctfe

4
推荐指数
1
解决办法
77
查看次数

在编译时D任意代码

我听说D可以在编译时执行任意用户代码.这是真的?有人可以给出一个例子(特别是当编译永远不会终止时)?这个功能是为了什么?另外,如果是这样的话有一种方法可以通过一些编译器选项来禁用它(编译器是dmd)?

d dmd ctfe

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

编译时函数的记忆

我想懒洋洋地评估函数.由于计算返回值很昂贵,我必须使用memoization,特别是对于被调用的子函数,否则计算的时间复杂度会呈指数级爆炸.我需要在编译时得到结果.(我正在编写一个库,根据提供的字符串提供各种编译时模板.)简而言之,我需要在编译期间进行memoization.

std.functional.memoize不起作用CT,所以这是不可能的.DMD和LDC不够聪明,不能记住纯函数,至少这是我对简单纯函数的实验结果:我测试它是否缓存结果:

使用简单的参数:

int sumN(int n) pure {
    int result = 0;
    for (int i = 0; i<=n; i++) result += i;
    return result;
}

void main() {
    enum sumMany =    sumN(2000000);
    enum sumMany2 =   sumN(2000000);
    writeln(sumMany, " ", sumMany2);
}
Run Code Online (Sandbox Code Playgroud)

使用模板参数:

int sumN(int n)() pure {
    int result = 0;
    for (int i = 0; i<=n; i++) result += i;
    return result;
}

void main() {
    enum sumMany =    sumN!2000000;
    enum sumMany2 =   sumN!2000000;
    writeln(sumMany, " ", sumMany2); …
Run Code Online (Sandbox Code Playgroud)

d memoization compilation-time ctfe

2
推荐指数
1
解决办法
105
查看次数

在编译时加入字符串

我想在编译时加入文件名和图像格式.以下示例不起作用,因为string[]无法在编译时评估我想...

immutable imageFormats = ["bmp", "jpg", "gif", "png"];

template fileNamesWithImageFormat(string[] fileNames)
{
    string[] fileNamesWithImageFormat() {
        string[] ret;
        ret.length = imageFormats.length * fileNames.length;

        for (int j = 0; j < fileNames.length) {
            for (int i = 0; i < imageFormats.length; ++i) {
                ret[j * fileNames.length + i] = fileNames[j] ~ "." ~ imageFormats[i];
            }
        }

        return ret;
    }
}
Run Code Online (Sandbox Code Playgroud)

它失败并显示错误消息:

Error: arithmetic/string type expected for value-parameter, not string[]
Run Code Online (Sandbox Code Playgroud)

我需要最终加入import().如何解决错误?

arrays string d ctfe

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

标签 统计

ctfe ×6

d ×6

arrays ×1

compilation-time ×1

dmd ×1

glsl ×1

memoization ×1

mixins ×1

opencl ×1

string ×1

type-traits ×1