标签: metaprogramming

在Boo中定义运算符

我正在寻找将一些较轻的元编程从Nemerle转移到Boo,我试图找出如何定义自定义运算符.例如,我可以在Nemerle中执行以下操作:

macro @<-(func, v) {
    <[ $func($v) ]>
}
Run Code Online (Sandbox Code Playgroud)

那么这两个是等价的:

foo <- 5;
foo(5);
Run Code Online (Sandbox Code Playgroud)

我无法在Boo中找到这样做的方法 - 任何想法?

macros boo metaprogramming nemerle

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

我怎样才能动态地添加一个方法在Ruby on Rails的Math类?

我想下面的方法添加到Ruby on Rails的Math类:

class Math
  def self.round_with_precision(number, precision)
    scalar = 10.0 ** precision
    number = number * scalar
    number = number.round
    number = number / scalar
    return number;
  end
end
Run Code Online (Sandbox Code Playgroud)

然后我将以下内容添加到我的environment.rb中:

require 'lib/math'
Run Code Online (Sandbox Code Playgroud)

当我打开Rails控制台时,我收到以下错误:'./ lib/math.rb:2:TypeError Math不是一个类'

好像我忽略了一些非常简单的事情.

有什么想法吗?

在此先感谢您的帮助.

ruby metaprogramming ruby-on-rails introspection

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

Ruby:打印任意方法的代码(和上下文中的exec)

我想做类似以下的事情:

class String
  def fancy_thing appendix
   # Just a trivial example to ensure self and params work.
   # Pretend this is something complex.
   self.reverse + appendix
  end
end

# print_method on instance or class should spit out a string
#  containing the actual code for that method
ft_code = "cob".print_method :fancy_thing
ft_code = String.print_instance_method :fancy_thing
  # => "{|appendix| self.reverse + appendix }"  *

# ft_code gets passed around a bit...

# exec on an object should run code (w/ parameters) …
Run Code Online (Sandbox Code Playgroud)

ruby metaprogramming exec

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

Ruby中的Open类与Groovy中的MOP的作用域

我想要弄清楚的是,我在Groovy中看到的是否与ExpandoMetaClasses有某种等价.我一直在阅读有关Open Classes的内容,但我无法确定Ruby允许类修改的范围.

借用上面博客中的一个例子,在Groovy中,我可以修改Java的String类并向它添加一个方法,如下所示:

String.metaClass.shout = {->
  return delegate.toUpperCase()
}

println "Hello MetaProgramming".shout()

// output
// HELLO METAPROGRAMMING
Run Code Online (Sandbox Code Playgroud)

而且我认为 Ruby会让你重新定义这个类并且可能是别名(请帮助澄清我此时的误解):

class String
  def foo
    "foo"
  end
end 

puts "".foo # prints "foo"
Run Code Online (Sandbox Code Playgroud)

在Groovy中,有一些方法可以将核心Java库方法重新定义为单个实例或使用Categories的一组实例,这些方法与我在Ruby中定义为mixins的方式类似.

将开放类的范围扩展到特定实例或模块子集的方法有哪些?

如果我要安装一个已重新定义某个核心类的gem,那么只会影响该模块,或者是否会将任何.rb文件包含在受该影响的gem中?

为Ruby和Groovy做出一些可能的假设提前道歉,我对两者都很新,但一直试图找到两者之间的等价.

ruby groovy metaprogramming

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

MetaPython:向类添加方法

我想在运行时向类定义添加一些方法.但是,在运行以下代码时,我得到一些令人惊讶的(对我而言)结果.

test.py

class klass(object):
    pass

for i in [1,2]:
    def f(self):
        print(i)
    setattr(klass, 'f' + str(i), f)
Run Code Online (Sandbox Code Playgroud)

在命令行上进行测试时,我得到以下信息:

>>> import test
>>> k = test.klass()
>>> k.f1()
2
>>> k.f2()
2
Run Code Online (Sandbox Code Playgroud)

为什么k.f1()返回2而不是1?这似乎与我相反.

笔记

该测试是在kubuntu机器上使用python3.0完成的.

python binding metaprogramming

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

在这个例子中lambda的目的是什么?

lambda在本例中用于组合和水合物方法.lambda在这做什么?

def compose *lambdas
  if lambdas.empty?
    lambda { nil }
  elsif lambdas.size == 1
    lambdas.first
  else
    lambda do |n|
      lambdas.first.call(compose(*lambdas[1..-1]).call(n))
    end
  end
end

def hydrate(modulus, printable_form)
  i = 0
  lambda do |n|
    (i = (i + 1) % modulus) == 0 && printable_form || n
  end
end

print(((1..100).map
   &compose(
     hydrate(15, 'Watermelon'), 
     hydrate(5, 'Melon'), 
     hydrate(3, 'Water'))).join(' '))
Run Code Online (Sandbox Code Playgroud)

我的第二个问题是 - 在撰写单词前面的&符号需要什么?

ruby lambda metaprogramming

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

Pythonic比较函数

为简单起见,假设我在Python中有一个Person类.该类包含firstname,lastname和dob的字段.

class Person:
  def __init__(self, firstname, lastname, dob):
    self.firstname = firstname;
    self.lastname = lastname;
    self.dob = dob;
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我想按姓氏排序人员列表,然后是firstname,后跟dob.在其他情况下,我想先用dob排序,然后用lastname排序,最后用firstname排序.有时我只想按名字排序.

创建第一个比较函数的天真解决方案是这样的:

def comparepeople(person1, person2):
  if cmp(person1.lastname, person2.lastname) == 0:
    if cmp(person1.firstname, person2.firstname) == 0:
      return cmp(person1.dob, person2.dob);
    return cmp(person1.firstname, person2.firstname);
  return cmp(person1.lastname, person2.lastname);
Run Code Online (Sandbox Code Playgroud)

看起来应该有一种简单的方法来定义这样的比较函数,使用元编程方法,我需要做的就是按优先顺序提供字段名称,而不是编写这些非常冗长,丑陋的比较方法.但我最近才开始玩Python,并没有找到类似我所描述的内容.

所以问题是,对于具有多个可比构成成员的类,编写比较函数的最Pythonic方法是什么?

python comparison metaprogramming

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

Ruby运算符可以别名吗?

我对如何让这个工作感兴趣:

me = "this is a string"
class << me
  alias :old<< :<<
  def <<(text)
    old<<(text)
    puts "appended #{text}"
  end
end
Run Code Online (Sandbox Code Playgroud)

我希望当某些内容被附加到me变量时,该对象将使用重新定义的方法.

如果我尝试运行它,我会syntax error, unexpected ':', expecting kEND接受:<<.

ruby monkeypatching metaprogramming operators

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

在模块名称空间中填充值

我有一个python模块.

我想在运行时为它填充一些值,我该怎么做.

例如.我有一个清单,

['A','B','C']

我正在创建具有这些名称的类,并希望它们可用,就像我正常创建它们一样

for el in ['A', 'B', 'C']:
    type(el, (object,), {})
Run Code Online (Sandbox Code Playgroud)

python module metaprogramming

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

覆盖Ruby中的"for"关键字.可能吗?

我搜索并尝试覆盖"for"关键字,但我什么也没找到.我正在尝试这样的事情:

def for("maybe_arguments_go_here")
  print "Hello from function for!"
end

for i in 1..3
  print "Hello from for"
end 
Run Code Online (Sandbox Code Playgroud)

ruby overriding metaprogramming

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