我在关于haskell和函数式编程的博客 (特别是在sigfpe的博客 )中阅读了很多关于这个术语的文章,但是我不知道它的含义。 我大部分时间都不知道,但是如果我知道的话,我可能会更好地理解这些文本。 谷歌没有帮助我。 我迷上了技术的东西。 而且,这个世界的非技术含义(“转向抽象的具体”)并不能帮助我理解它在代码中的实际意义。 我对计算机科学概念有点慢,所以用代码的实际例子会很好。 :P
我已经阅读了几个不同的地方,使用C ++ 11的新string文字,可能在编译时计算string的哈希值。 然而,似乎没有人愿意出来说这将是可能的或将如何完成。 这可能吗? 运营商会是什么样子? 我特别感兴趣的使用这种情况。 void foo( const std::string& value ) { switch( std::hash(value) ) { case "one"_hash: one(); break; case "two"_hash: two(); break; /*many more cases*/ default: other(); break; } } 注意:编译时散列函数不必像我写的那样精确。 我尽我所能去猜测最终的解决scheme是什么样的,但meta_hash<"string"_meta>::value也可能是一个可行的解决scheme。
假设我有以下哈希: { :foo => 'bar', :baz => 'qux' } 我怎样才能dynamic地设置键和值成为对象的实例variables… class Example def initialize( hash ) … magic happens here… end end …所以我最终在模型里面 @foo = 'bar' @baz = 'qux' ?
一般来说,我怎么能得到一个对象的名称,我有一个string? 更具体地说,我有一个参数名称的列表(成员variables – dynamic构build,所以我不能直接引用它们)。 每个参数都是一个也有一个from_s方法的对象。 我想要做下面的事情(这当然不起作用): define_method(:from_s) do | arg | @ordered_parameter_names.each do | param | instance_eval "field_ref = @#{param}" field_ref.from_s(param) end end
如果您尝试以元编程方式创build类方法,这非常有用: def self.create_methods(method_name) # To create instance methods: define_method method_name do … end # To create class methods that refer to the args on create_methods: ??? end 我的回答是…
我目前主要是一个D程序员,我正在寻找添加另一种语言到我的工具箱,最好是一个支持元编程的黑客,只是不能用像D这样的静态编译语言来完成。我已经读了一下Lisp我很想find一种允许Lisp做的很酷的语言,但是没有Lisp的奇怪语法等等。 我不想开始一场语言的火焰战争,我确信Ruby和Python都有他们的权衡,所以我会列出对我个人来说重要的东西。 请告诉我,Ruby,Python还是其他一些语言对我来说最好。 重要: 好的元编程。 能够在运行时创build类,方法,函数等。 优选地,代码和数据之间的最小区分,Lisp样式。 干净,清晰,语法清晰,一致,直观的语义。 基本上是一个深思熟虑,有趣的使用,现代语言。 多种范例。 对于每个项目,甚至项目中的每一个小的子问题,没有一个范例是正确的。 一种有趣的语言,实际上影响了人们对编程的思考方式。 有一些重要: 性能。 如果performance不错,但是如果performance真的是优先考虑的话,我会用D代替。 充分certificate。 不重要: 社区大小,图书馆的可用性等。这些都不是语言本身的特点,而且都可以很快改变。 工作可用性。 我不是一个全职的专业程序员。 我是一名研究生,编程与我的研究是切线相关的。 任何主要由非常大的项目devise的function都是由百万条代码猴子来完成的。
静态元编程(又名“模板元编程”)是一个非常棒的C ++技术,允许在编译时执行程序。 当我阅读这个典型的元编程例子时,一个灯泡在我脑海中消失了: #include <iostream> using namespace std; template< int n > struct factorial { enum { ret = factorial< n – 1 >::ret * n }; }; template<> struct factorial< 0 > { enum { ret = 1 }; }; int main() { cout << "7! = " << factorial< 7 >::ret << endl; […]
在C ++编译期间能够创build和操作string有几个有用的应用程序。 尽pipe可以在C ++中创build编译时string,但是这个过程非常麻烦,因为string需要被声明为可变字符序列,例如 using str = sequence<'H', 'e', 'l', 'l', 'o', ', ', 'w', 'o', 'r', 'l', 'd', '!'>; 诸如string连接,子串提取等许多操作可以很容易地实现为对字符序列的操作。 是否可以更方便地声明编译时string? 如果不是的话,有没有一个scheme可以方便的声明编译时间string? 为什么现有的方法失败 理想情况下,我们希望能够声明编译时间string如下: // Approach 1 using str1 = sequence<"Hello, world!">; 或者,使用用户定义的文字, // Approach 2 constexpr auto str2 = "Hello, world!"_s; decltype(str2)将有一个constexpr构造函数。 方法1的一个更复杂的版本可以实现,利用这个事实,你可以做到以下几点: template <unsigned Size, const char Array[Size]> struct foo; 然而,数组需要有外部链接,所以为了让方法1工作,我们必须写这样的东西: /* […]
我想从类对象本身获得一个类的string名称。 // For instance [NSArray className]; // @"NSArray" 我发现object_getClassName(id obj)但需要一个实例传递给它,在我的情况下,这是不必要的工作。 那么如何从类对象中获取string,而不是实例呢?
在最近的一次采访中,我被问到一个非常奇怪的问题。 面试官问我如何使用编译器function来计算1 + 2 + 3 + … + 1000。 这意味着我不允许编写程序并执行它,但是我应该编写一个程序,它可以在编译时驱动编译器计算总和,并在编译完成时输出结果。 作为一个暗示,他告诉我可以使用编译器的generics和预处理器特性。 可以使用C ++,C#或Java编译器。 有任何想法吗??? 这个问题是不相关的计算总和没有任何循环问这里 。 另外,应该注意的是,这个总和应该在编译时计算。 使用C ++编译器指令打印结果是不可接受的。 阅读更多关于已发布的答案,我发现使用C ++模板编译期间解决问题称为元编程 。 这是Erwin Unruh博士在标准化C ++语言的过程中偶然发现的一种技术。 您可以在元编程的wiki页面上阅读更多关于此主题的内容。 看来有可能使用Java注释在Java中编写程序。 你可以看看下面的女士的答案。 一本关于C ++元编程的好书就是这个 。 值得一看,如果感兴趣。 一个有用的C ++元编程库是Boost的MPL 这个链接 。