这是原始问题的简化版本.
我有一个名为Person的类:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......然后说一个例子:
var bob = new Person {
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = '1/1/2000'
}
Run Code Online (Sandbox Code Playgroud)
我想在我最喜欢的文本编辑器中将以下内容写成字符串 ....
(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3
Run Code Online (Sandbox Code Playgroud)
我想取这个字符串和我的对象实例并评估一个TRUE或FALSE - 即在对象实例上评估一个Func <Person,bool>.
这是我目前的想法:
Pony ORM做了将生成器表达式转换为SQL的好方法.例:
>>> select(p for p in Person if p.name.startswith('Paul'))
.order_by(Person.name)[:2]
SELECT "p"."id", "p"."name", "p"."age"
FROM "Person" "p"
WHERE "p"."name" LIKE "Paul%"
ORDER BY "p"."name"
LIMIT 2
[Person[3], Person[1]]
>>>
Run Code Online (Sandbox Code Playgroud)
我知道Python内置了精彩的内省和元编程,但是这个库如何能够在不进行预处理的情况下转换生成器表达式?它看起来像魔术.
[更新]
Blender写道:
这是你要追求的文件.它似乎使用一些内省魔法重建了生成器.我不确定它是否支持100%的Python语法,但这非常酷.- 搅拌机
我在想他们正在探索生成器表达式协议的一些功能,但是查看这个文件,并看到所ast涉及的模块......不,他们不是在动态检查程序源,是吗?令人兴奋...
@BrenBarn:如果我尝试在select函数调用之外调用生成器,结果是:
>>> x = (p for p in Person if p.age > 20)
>>> x.next()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "<interactive input>", line 1, in <genexpr>
File "C:\Python27\lib\site-packages\pony\orm\core.py", …Run Code Online (Sandbox Code Playgroud) 我想我正在寻找某种介绍,看看是否有人使用过它.使用它有什么特别的好处吗?
维基百科:
域特定语言(DSL)是专用于特定问题域的编程语言或规范语言,特定问题表示技术和/或特定解决方案技术.
任何人都可以提供有关如何实现它或在特定场景中它如何有用的具体示例吗?
我知道在Capybara,你可以这样做:
page.should have_css("ol li", :count => 2)
Run Code Online (Sandbox Code Playgroud)
但是,假设该页面仅具有一个匹配元素,则该错误不是非常具有描述性:
1) initial page load shows greetings
Failure/Error: page.should have_css("ol li", :count => 2)
expected css "ol li" to return something
Run Code Online (Sandbox Code Playgroud)
而不是这个相当模糊的错误消息,有没有办法以这样的方式编写断言,即错误输出将类似于'匹配'ol li',期望:2,找到:1'.显然我可以自己为这样的行为制作一个自定义逻辑 - 我问有没有办法在开箱即用的情况下做到这一点?
对于它的价值,我使用的是Selenium驱动程序和RSpec.
我试图在Android Studio中运行我的项目,但错误如下所示:

我已经跟踪了许多消息来源,只是为了让它运行并在这里结束,但不知道还能做什么.
如何配置此项目以运行?
的build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
allprojects {
repositories {
mavenCentral()
}
}
android {
compileSdkVersion 19
buildToolsVersion "19.1"
}
Run Code Online (Sandbox Code Playgroud)
settings.gradle:
include ':app'
Run Code Online (Sandbox Code Playgroud)
local.properties:
sdk.dir=C\:\\Users\\KJA\\AppData\\Local\\Android\\sdk
Run Code Online (Sandbox Code Playgroud)
gradle.propertes:
# IDE (e.g. Android Studio) users:
# Settings specified in this file will override any Gradle settings
# configured through the IDE.
# For more details on how to …Run Code Online (Sandbox Code Playgroud) 我在几个项目中使用了Eclipse Xtext.我喜欢在Ecore(meta)模型上定义语法的简易性,并为你生成所有内容,包括令人敬畏的Eclipse插件编辑器,但我对基础EMF框架感到非常不舒服,所有内容都在静态字段中进行了硬连接.
最近我遇到了Jetbrains的MPS(元编程系统).它基于完全不同的哲学.虽然Xtext用于创建基于文本的DSL,为您生成解析器(并实例化那些EObject),但在MPS创建的语言中,可直接编辑基础模型结构.到目前为止,我明白了.
有没有人使用这两种DSL工具来指出在使用它们方面的主要差异,预期用例和受众,复杂性,学习曲线(说实话,开始使用Xtext应该对EMF的内容有很多了解) ,代码生成等?
我在Python中创建一个简单的迷你语言解析器,在问题域附近进行编程以及所有这些.
无论如何,我想知道这里的人们会如何做到这一点 - 在Python中做这种事情的首选方式是什么?
我不会详细说明我所追求的内容,因为目前我只是在研究整个领域在Python中的容易程度.
感谢您的输入!
我正在开发一个项目,除其他外,涉及数据库访问层.非常正常,真的.在之前的项目中,合作者鼓励我将Free Monads概念用于数据库层,所以我做到了.现在,我正在尝试在我的新项目中决定我获得了什么.
在之前的项目中,我有一个看似相似的API.
saveDocument :: RawDocument -> DBAction ()
getDocuments :: DocumentFilter -> DBAction [RawDocument]
getDocumentStats :: DBAction [(DocId, DocumentStats)]
Run Code Online (Sandbox Code Playgroud)
大约二十个这样的公共职能.为了支持它们,我有了DBAction数据结构:
data DBAction a =
SaveDocument RawDocument (DBAction a)
| GetDocuments DocumentFilter ([RawDocument] -> DBAction a)
| GetDocumentStats ([(DocId, DocumentStats)] -> DBAction a)
| Return a
Run Code Online (Sandbox Code Playgroud)
然后是monad实现:
instance Monad DBAction where
return = Return
SaveDocument doc k >>= f = SaveDocument doc (k >>= f)
GetDocuments df k >>= f = GetDocuments df (k >=> f)
Run Code Online (Sandbox Code Playgroud)
然后是口译员.然后是实现每个不同查询的原始函数.基本上,我觉得我有大量的胶水代码.
在我当前的项目中(在一个完全不同的领域),我已经为我的数据库添加了一个非常普通的monad: …
我在我的音乐项目中遇到了一个小的美学问题,它一直困扰着我一段时间。
我有一个类型data Key = C | D | ...,我可以Scale从 aKey和 a构造a Mode。该Mode例如主要的和次要的规模进行了区分。
我可以将Mode类型定义为从Keyto的函数Scale。在这种情况下,模式将具有小写名称(这很好),我可以得到这样的 Scale
aScale = major C
Run Code Online (Sandbox Code Playgroud)
但是音乐家不会这样说话。他们将此音阶称为C 大调音阶,而不是C 大调音阶。
我想要的是
理想情况下我想写
aScale = C major
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我试过的
我可以创建Key一个Scale从 a构造 a 的函数Mode,所以我可以写
aScale = c Major
Run Code Online (Sandbox Code Playgroud)
但是我不能将 Keys 限制为构建 Scales。其他事情也需要它们(例如构建和弦)。也Key应该是Show.
当我使用额外的函数(或值构造函数)时,我可以把它放在Mode后面Key:
aScale = …
是.那就对了.我希望能够粘贴一个表达式,如:
"a && b || c"
Run Code Online (Sandbox Code Playgroud)
直接作为字符串源代码:
const std::string expression_text("a && b || c");
Run Code Online (Sandbox Code Playgroud)
使用它创建一个延迟评估的结构:
Expr expr(magical_function(expression_text));
Run Code Online (Sandbox Code Playgroud)
然后在评估中用已知值代替:
evaluate(expr, a, b, c);
Run Code Online (Sandbox Code Playgroud)
我想稍后扩展这个小DSL,所以使用一些非C++语法做一些更复杂的事情,所以我不能简单地用简单的方法对我的表达式进行硬编码.用例是我能够将另一个开发区域中使用的另一个模块中的相同逻辑复制并粘贴到另一种语言中,而不是每次都要调整它以遵循C++语法.
如果有人能让我开始至少如何做1个表达式的上述简单概念和2个布尔运算符,那将是非常感激的.
注意:由于我发布的另一个问题的反馈,我发布了这个问题:如何解析DSL输入到高性能表达模板.在这里,我实际上想要一个稍微不同的问题的答案,但是评论引发了我认为值得发布的这个具体问题,因为潜在的答案真的值得记录.