我已经制作了这个社区Wiki,因为有些人可能认为它可以辩论,其他人可能会认为这是一个用词来表示他们真正意义的问题(换句话说,这是一个意见问题,这是一个意见问题).
关于声明性编程的SO有一个普遍的问题,它有一些很好的答案.
但是我对微软福音传道者的这篇博文有点不满.
声明性编程的一个优点是,您可以指出您想要做什么,而不是如何做.
到目前为止,这么好 - 事实上,这与SO问题上接受的答案完全一致.
但是请查看有关"服务实施"的部分,
您可以查看几十行xaml代码,并能够确定如何配置WCF服务以及如何定义相应的工作流.
看了一些例子后,让我简单回答一下,说"不,我不能".但是,不要轻率地解雇这些东西,让我们看看文档.
这需要一段时间,但最终现实已经赶上了讽刺 ......但这不是重点 - 当然他们并没有认真地建议这样做来揭露像添加这样的微不足道的东西.我也不是在抱怨荒谬的冗长,以及任何人都会手写这样的东西的奇怪想法 - 它看起来更像是编译器的输出而不是人类可读的语言.
对我来说,难题是声称这是"声明性的".然而它的核心是一个任务声明.
还有更多:
声明性服务在XAML中以声明方式定义,并提供另一层抽象.基本上,您可以通过定义服务要执行的操作而不是如何执行操作来创建服务模型.整个服务可以以声明方式定义,包括操作的实现.
因此,如果我们说声明性或声明性三次,那就使它成为声明性的.疑难杂症.如果我们说出"你想做什么而不是怎么做"的神奇短语,那么我们可以忽略一点,在下一句话中,我们将指定"操作的实施",所以我们我会准确地说明如何做到这一点.
该页面中的示例是:
<wma:Sequence>
<wma:WriteLine Text ='[String.Concat(String.Concat(String.Concat(String.Concat("Add(", CType(op1, Object)), ","), CType(op2, Object)), ") called")]' />
<wma:Assign x:TypeArguments="xs:Int32" To="[result1]" Value="[op1 + op2]" />
</wma:Sequence>
Run Code Online (Sandbox Code Playgroud)
也就是说,整个事情(包括我从WF示例中删除的大量垃圾)恰恰相当于:
void Add(int op1, int op2, out int result1)
{
Console.WriteLine("Add(" + op1 + ", " + op2 + ") called");
result1 = op1 + op2; …
Run Code Online (Sandbox Code Playgroud) 看http://www.hibernate.org/它有这个介绍文本:
从历史上看,Hibernate通过对象/关系映射促进了Java域对象的存储和检索.今天,Hibernate是一个相关项目的集合,使开发人员能够在其应用程序中以远远超出对象/关系映射的方式利用POJO样式的域模型.
换句话说:最初它是关于ORM的,现在它不仅仅是ORM.
在线之间阅读:ORM并不是城里唯一的游戏 - 有更新的方式来处理这些可能更好的事情.
当我进入文档时,它仍然只是将其描述为ORM库.是否有任何好的博客文章概述了已经采取的任何新的"后ORM"方法,以及这些功能如何工作和打算使用(以及它们如何/为什么可能比"传统"ORM更好)?
使用Crockford的JSLINT,在调用JSLINT()
解析一些JavaScript源代码后,它提供了对解析树的访问JSLINT.tree
能够分析树,根据分析对其进行结构更改然后从修改后的树生成新的JavaScript将非常强大.
是否有一个基于JSLINT构建的开源项目,它提供了从解析树到JavaScript的转换?
(这是否可能,即JSLINT是否保留了完整的解析信息,以便对所有重要内容进行往返?)
偶尔我发现我需要通过在每个项目之后插入一个新项目来处理列表,除了最后一个项目.类似于在字符串列表的每个项目之间放置逗号的方式.
我厌倦了每次编写最后一个(或第一个)项目的特殊情况,所以我在Linq风格的扩展中捕获了模式:
public static IEnumerable<T> Separate<T>(this IEnumerable<T> source,
Func<T> separator)
{
bool first = true;
foreach (T item in source)
{
if (first)
first = false;
else
yield return separator();
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
例如,这允许我以编程方式使用超链接以编程方式填充流文档,但每个文件之间有换行符:
para.Inlines.AddRange(_recentFiles.Select(f => f.ToHyperlink())
.Separate(() => new LineBreak()));
Run Code Online (Sandbox Code Playgroud)
假设System.Linq.Enumerable中不存在这个(这是我在写这样的东西之后通常会立即发现的),问题是,Separate
在其他功能框架或语言中通常调用的列表上的这个操作是什么?
c# language-agnostic functional-programming stream lazy-evaluation
之前的问题询问是否可以将已编译的委托转换为表达式树,例如:
当时理智的答案是:
但幸运的是,有一些非常疯狂/疯狂的伟大的人喜欢逆向工程的东西,他们让我们其他人的事情变得容易.
显然,可以将IL反编译为C#,因为Reflector会这样做,因此您原则上可以使用支持所有语句类型的CLR 4.0表达式树.这很有意思,因为编译器对Expression<>
lambdas 的内置特殊支持永远不会扩展为支持编译器中的构建语句表达式树并不重要.图书馆解决方案可填补这一空白.然后,我们将有一个高级别的起点,用于编写类似方面的代码操作,而不必混淆原始IL.
如上述相关问题的答案所述,有一些有希望的迹象,但我没有成功地发现自搜索以来是否取得了很大进展.
那么有人完成这项工作,还是走得很远?
注意: CLR 4.0现已发布.再看看的时间 - 看.
我一直在试验Roslyn中最近开源的C#编译器,看看我是否可以添加语言功能.
我现在正在尝试添加一些语法糖,一个新的前缀运算符,它基本上是某种模式的简写.就目前而言&
,除了unsafe
背景之外,我还捎带已经存在的"地址" .
我想扩展的模式如下:&n
相当于:
Property.Bind(v => n = v, () => n)
Run Code Online (Sandbox Code Playgroud)
Property.Bind
假设该方法在库中可用,签名为:
public static IProperty<T> Bind<T>(Action<T> set, Func<T> get)
Run Code Online (Sandbox Code Playgroud)
所以本质上我需要合成两个lambdas:
n
为左值并从其参数中对其进行赋值,并且n
.然后我需要调用Property.Bind
将这两个lambdas作为参数传递.我以前的实验比这更容易,因为他们能够依靠易于查找的现有功能,所以几乎没有工作要做!
但这次我正在努力寻找类似于我在这里所做的事情.到目前为止,我一直在逐步介绍BoundLambda
编译器如何从源代码构建它,并且它正在展开成一个大混乱.我修改BindAddressOfExpression
的Binder_Operators.cs
,使得它与一个额外的启动if
安全上下文语句:
private BoundExpression BindAddressOfExpression(PrefixUnaryExpressionSyntax node, DiagnosticBag diagnostics)
{
if (!this.InUnsafeRegion)
{
BoundExpression rValue = BindValue(node.Operand, diagnostics, BindValueKind.RValue);
BoundExpression lValue = BindValue(node.Operand, diagnostics, BindValueKind.Assignment);
var valueParamSymbol = new SourceSimpleParameterSymbol(null, rValue.Type, 0, RefKind.None, "__v", ImmutableArray<Location>.Empty);
var …
Run Code Online (Sandbox Code Playgroud) HTML音频播放器API是我在Cordova中发现的最好方法,即不使用任何插件,而只是使用新兴的标准Web技术。
在React Native中是否有用于音频播放的polyfill,或者计划要使用polyfill?
我有一个Patient实体和一个List实体.患者可以属于几个不同的列表,并且列表可以具有多个不同的患者.
假设我的病人属于3个名单(A,B,C).我想从列表A和B中删除患者.虽然很明显,我不想删除列表A和B. 我该怎么做呢?
我经常想用正则表达式解析一个字符串,找到所有的匹配以及所有不匹配的字符串,并且所有的字符串都按照原始顺序散布,例如
var parsed = regexParse(/{([^}]+)}/g, 'Hello {name}, you are {age} years old');
Run Code Online (Sandbox Code Playgroud)
因此parsed
将包含:
0 : "Hello "
1 : match containing {name}, name
2 : ", you are "
3 : match containing {age}, age
4 : " years old"
Run Code Online (Sandbox Code Playgroud)
JavaScript(或一些广泛使用的库)中是否有类似于此regexParse
函数的内容?我写了我自己的版本,但似乎很明显,我怀疑必须已经采用"标准"的方式:
var regexParse = function(rx, str) {
var nextPlain = 0, result = [], match;
rx.lastIndex = 0;
for (;;) {
match = rx.exec(str);
if (!match) {
result.push(str.substr(nextPlain));
break;
}
result.push(str.substr(nextPlain, match.index - nextPlain)); …
Run Code Online (Sandbox Code Playgroud) 我正在给TypeScript另一个尝试版本0.9.5,让它独自留了一段时间.
在我发现的新旧信息的混合中,我认为项目中的所有TypeScript文件都会"隐式地引用"彼此.
我无法弄清楚这意味着什么.我的一个理论是,它意味着每个文件都能够查看从其他所有文件导出的所有函数,类等,所有这些都在全局范围内.(如果这是真的,这听起来不是一个好主意.)
问题是,我无法确定是否有任何解释是正确的,因为0.9.5与Visual Studio的集成似乎存在错误,因此它没有做到(人们)所期望的.
我的测试是在Visual Studio 2013中创建的"带有TypeScript的HTML应用程序"项目,其中从项目模板页面的链接安装了TypeScript插件.
我添加了第二个.ts
文件,导出一个愚蠢名称的类:
export class Hedgehog {
spikes() {
return 100;
}
}
Run Code Online (Sandbox Code Playgroud)
并且还knockout.d.ts
从DefinitelyTyped添加.
在主app.ts
文件中,如果我尝试使用我的类,VS会给出智能感知错误app.ts
:
var h = new Hedgehog(); // Could not find symbol Hedgehog
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用以下任何内容,它也会抱怨ko
:
var five = ko.observable(5); // Could not find symbol ko
Run Code Online (Sandbox Code Playgroud)
这个问题抱怨隐式引用不起作用,并且有一个暗示解决方案的注释,即手工编辑项目文件.但是,那个人改变了他们项目的这一行:
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets"
Condition="'$(Configuration)' == 'Debug'" />
Run Code Online (Sandbox Code Playgroud)
对此:
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets"
Condition="Exists('$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets')" />
Run Code Online (Sandbox Code Playgroud)
然后他们显然很高兴(虽然结果如何?!)
但是我刚刚产生的项目已经看起来像第二个版本.我试图完全删除这个条件:
<Import Project="$(VSToolsPath)\TypeScript\Microsoft.TypeScript.targets" />
Run Code Online (Sandbox Code Playgroud)
然后我取得了一些进展.我现在在两个.ts文件中对Knockout进行智能感知,但我仍然无法使用我的Hedgehog
课程.我需要添加:
import otherFile …
Run Code Online (Sandbox Code Playgroud) c# ×3
javascript ×2
.net-4.0 ×1
core-data ×1
declarative ×1
hibernate ×1
iphone ×1
jslint ×1
objective-c ×1
orm ×1
parsing ×1
react-native ×1
regex ×1
roslyn ×1
roundtrip ×1
stream ×1
typescript ×1
wcf ×1
xcode ×1