大多数语言允许"调整"语法的某些扩展部分(C++,C#)和/或将在代码中使用的语义(Katahdin,lua).但我还没有听说过一种语言可以完全定义代码的样子.那么是不是已经存在一些具有覆盖所有语法和定义语义的能力的语言?
我想要做的例子基本上来自下面的C#代码:
foreach(Fruit fruit in Fruits)
{
if(fruit is Apple)
{
fruit.Price = fruit.Price/2;
}
}
Run Code Online (Sandbox Code Playgroud)
我想能够用我这样完美的语言编写上面的代码:
Check if any fruits are Macintosh apples and discount the price by 50%.
Run Code Online (Sandbox Code Playgroud)
从这个"想象的"语言中编码器的角度来看,我想到的优点是:
我认为维护这个程序的程序员的缺点是:
Create a form called MyGreetingForm. Draw a square with in the middle of
MyGreetingFormwith a side of 100 points. In the middle of the square write "Hello! Click here to continue" in …
我可以解决一下如何使我的非异常对象变为'throwable',以便在try块中声明任何局部变量,就像obj在下面的try块中一样
try
{
SomeObject obj = new SomeObject();
}catch {}
Run Code Online (Sandbox Code Playgroud)
可以跨越范围边界到catch {}子句?我想obj在catch {}子句中使用该实例,即使它的状态被破坏了.这有可能吗?
也许可能(?)因为C#编译器可能做的类似(对于优化我假设?)并允许catch子句接收任何System.Object但我不能在VS中使用它,对于这个方法:
public void Foo()
{
try
{
}
catch(Exception ex)
{
}
try
{
}
catch
{
}
}
Run Code Online (Sandbox Code Playgroud)
生成这个IL:
.method public hidebysig instance void Foo() cil managed
{
// Code size 22 (0x16)
.maxstack 1
.locals init ([0] class [mscorlib]System.Exception ex)
IL_0000: nop
.try
{
IL_0001: nop
IL_0002: nop
IL_0003: leave.s IL_000a
} // end .try
catch [mscorlib]System.Exception
{
IL_0005: …Run Code Online (Sandbox Code Playgroud) 有没有办法做到这一点(psedo代码):
GetCurrentThread().Items.Add(new RefObject);
Run Code Online (Sandbox Code Playgroud)
然后再回顾它
RefObject[] refObjs = GetCurrentThread().Items;
Run Code Online (Sandbox Code Playgroud)
并枚举对象.显然,这两个调用都会在它的生命周期内发生在同一个线程上.
基本的想法是,我可以轻松识别当前线程的项目,并且它们实际上是在此线程中创建的.它与将Page.Request对象用于ASP.NET请求相同 - 您知道它在工作进程中非常独特,因此它不会与同时提供的其他请求混淆.我想对待一个线程Page.Request- 它来然后去,但是当它还活着时,我可以随意查询它而不关心过程中存在的其他威胁.
一旦我做了类似的事情,但它更多的是通过引用编组对象的模拟.我可以想到几种方法,但我真的不想自己手动存储线程和对象之间的映射.对于.NET中的线程,是不是有类似于TransactionScope的东西?我不太喜欢处理同步困难和避免竞争条件.
PS:如果没有,我是否可以至少为没有静态变量的应用程序域做到这一点?