小编Ben*_*ren的帖子

如何评估 nim 中的表达式?

我正在尝试eval在 nim 中执行与Python 中的方法等效的方法。我的印象是parseStmtmacros包中应该可以帮助我解决这个问题,但我正面临一个我不明白的编译问题。

import macros

echo parseStmt("1 + 2")
Run Code Online (Sandbox Code Playgroud)

我本来希望它3在执行时打印出来,但编译却抱怨说

Error: request to generate code for .compileTime proc: $
Run Code Online (Sandbox Code Playgroud)

我找到了这个线程,那里的例子有效,在此之后,我能够使以下程序按我的预期工作:

import macros
import strformat

macro eval(value: string): untyped =
  result = parseStmt fmt"{value}"

echo eval("1+2")
Run Code Online (Sandbox Code Playgroud)

但我完全不明白为什么它需要以这种方式编写。如果我内联语句, let value = "1 + 2"; echo parseStmt fmt"{value}",我会得到与上面相同的编译错误。

另外,为什么parseStmt valueparseStmt fmt"{value}", 在上述eval宏的上下文中不同?

我在这里缺少什么?

预先感谢您的任何澄清!

macros metaprogramming nim-lang

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

在 Pyside2 中将 QAbstractListModel 声明为属性

我正在将 Pyside2 与 QML 一起使用,并尝试对我的代码进行良好的组织。我要揭露一个子类MyModelQAbstractListModel从Python来QML,在使用ListView。如果我MyModel直接在引擎内部声明实例,则代码完美运行:

...
engine = QQmlApplicationEngine()
myModel = MyModel(some_dict)
engine.rootContext().setContextProperty("myModel ", myModel)
...
Run Code Online (Sandbox Code Playgroud)

然后我可以使用它:

ListView {
    model: myModel
    delegate: Row {
        Text { text: name }
        Text { text: type }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将这个元素定义Property为一个类时,为了保持整洁而不是到处注册模型,我似乎无法让它工作。我无法从 qml 恢复良好的调试信息,这也无济于事。

我试图声明以下内容

ListView {
    model: myModel
    delegate: Row {
        Text { text: name }
        Text { text: type }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在qml中使用它

ListView {
    model: modelProvider.myModel
    // or model: modelProvider.myQVariantModel 
    delegate: Row …
Run Code Online (Sandbox Code Playgroud)

python qt qml pyside2

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

标签 统计

macros ×1

metaprogramming ×1

nim-lang ×1

pyside2 ×1

python ×1

qml ×1

qt ×1