我对用F#编写的元编程示例感兴趣,这些示例演示了F#特定功能的使用,例如TryGetReflectedDefinitionF#标准库中的函数.
我在哪里可以找到这样的例子?
我可以编译指令到字节码,甚至可以轻松地执行它们,但是我发现提取CIL的唯一函数是,GetILAsByteArray并且顾名思义,它只返回字节而不是CIL指令.
那么如何以编程方式在.NET上反汇编CIL?
请注意,我不希望结果以人类可读的形式出现.我想编写元程序来操纵从其他程序生成的CIL.
由联合,交叉和差异组成的集合计算通常可以用许多不同的方式表达.是否有任何理论或具体实施试图最小化达到给定答案所需的计算量?
例如,我在尝试将无定形材料模拟中的原子分解为相邻壳时首先遇到了这种实际应用,其中第一个壳是某个给定原点原子的直接邻居,第二个壳是那些邻居的原子.第一个shell中的第一个shell不在第一个shell中,也不在第一个shell中:
nth 0 = singleton i
nth 1 = neighbors i
nth n = reduce union (map neighbors (nth(n-1))) - nth(n-1) - nth(n-2)
Run Code Online (Sandbox Code Playgroud)
有许多不同的方法可以解决这个问题.您可以在编写结果时逐步测试每个集合中的成员资格,或者您可以计算三个邻居shell的并集,并使用交集来删除前两个shell而不是最外层的shell.在实践中,需要构建大型中间组的解决方案较慢.
据推测,智能集实现可以构成要评估的表达式,然后在评估之前对其进行优化(例如,减小中间集的大小),以便提高性能.这样的集合实现是否存在?
我有各种丰富的数据结构(主要是树),我希望将其保存到磁盘,这意味着我不仅要将它们写入磁盘,而且还要保证数据已经完全写入并且能够在断电后继续存在.
其他人似乎设计了将平面数据库表中的丰富数据结构编码为从父节点到子节点的查找表的方法.这有助于针对数据运行SQL查询,但我不需要:我只想保存并加载我的树.
显而易见的解决方案是将所有内容作为blob存储在数据库中:单个条目可能包含长字符串.这是滥用数据库还是推荐的做法?另一种解决方案可能是使用XML数据库?我应该考虑使用数据库的替代方案吗?
最后,我是用F#做的,所以从.NET继承数据的交钥匙解决方案是理想的......
编辑:请注意格式化(例如序列化)是无关紧要的,因为我可以通过F#轻松转换格式.这是关于确认写入已经完成到非易失性存储(即磁盘盘片)并且写入数据的任何部分仍然保留在易失性存储(例如RAM高速缓存)中,以便我可以继续保持这种知识的安全性(例如,通过从磁盘中删除旧版本的数据).
移动垃圾收集器(例如分代收集器)会产生额外生成的代码,以便跨GC安全点存储和重新加载引用.与非移动收集器相比,有没有人量化过这种开销的性能成本?
我问,因为我有兴趣设计一个收集器,可以有效地回收短期值而无需移动它们.
有许多基本的图算法,如拓扑排序,强/弱连接组件,全对/单源最短路径,可达性等.这些算法的增量变体具有各种重要的实际应用."增量"是指那些图形算法,它们可以计算输出的微小变化(例如边缘插入和删除),而无需重新计算所有内容.例如,垃圾收集器累积堆分的子图,这些块可以从全局根中获得.但是,我不记得在特定领域的文献中讨论增量图算法的主题(例如Richard Jones关于GC的新书).
我在哪里可以找到有关增量图算法的信息,或者就此而言,一般情况下是增量算法?
我正在使用字典来累积键的出现次数,因此,核心操作是写一个键值对,其中值是前一个值加一个,如果没有先前的值,则只有一个.但是,当我可以做一个(AddOrUpdate)时,这需要两个单独的字典操作(读和写).
我注意到并发字典支持AddOrUpdate但普通泛型Dictionary似乎不支持.
因此,可变int的引用字典更快.但是,这会引入不必要的引用,这意味着堆分配和写入障碍.所以我猜我有可能做得更好,但我看不出如何不Dictionary从头开始重写.我对吗?
我需要在一个大的Mathematica代码库(数十万行代码)上做一些元编程,并且不想编写一个完整的解析器,所以我想知道如何最好地从Mathematica笔记本中获取代码用一种易于解析的语法.
是否可以在FullForm语法中导出Mathematica笔记本,或者在语法中保存所有定义FullForm?
该文档的Save说,它可以在唯一的出口InputForm语法,这是不平凡的解析.
到目前为止,我所拥有的最佳解决方案是评估笔记本,然后使用DownValues参数提取重写规则(但这会错过符号定义),如下所示:
DVs[_] := {}
DVs[s_Symbol] := DownValues[s]
stream = OpenWrite["FullForm.m"];
WriteString[stream,
DVs[Symbol[#]] & /@ Names["Global`*"] // Flatten // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试了各种方法,但没有一种方法效果很好.Mathematica中的元编程似乎非常困难,因为它一直在评估我想要保持不被评估的事物.例如,我想获取无穷大符号的字符串名称,SymbolName[Infinity]但是将Infinity得到的值计算为非符号,并且调用SymbolName带有错误的die.因此,我希望用更合适的语言进行元编程.
编辑
最好的解决方案似乎是手动将笔记本保存为包(.m)文件,然后使用以下代码进行翻译:
stream = OpenWrite["EverythingFullForm.m"];
WriteString[stream, Import["Everything.m", "HeldExpressions"] // FullForm];
Close[stream];
Run Code Online (Sandbox Code Playgroud) 这个实用的Haskell示例鼓励我安装Visual Studio 2012试用版以使用F#类型的提供程序.但是,我完全不知道如何使用它来解决这个问题.有一个RCSB SOAP Web服务.我使用来自RCSB的WSDL Web服务的URL 复制了一个示例(因为Web服务API已更改,因此无效):
open Microsoft.FSharp.Data.TypeProviders
type pdb = WsdlService<"http://www.rcsb.org/pdb/services/pdbws?wsdl">
do
let ws = pdb.Getpdbws()
ws.getCurrentPdbIds()
|> printfn "%A"
Run Code Online (Sandbox Code Playgroud)
但是这会在运行时因错误而崩溃:
Unhandled Exception: System.InvalidOperationException: RPC Message blastPDBRequest1 in operation blastPDB1 has an invalid body name blastPDB. It must be blastPDB1
at System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.OperationReflector.EnsureMessageInfos()
at System.ServiceModel.Description.XmlSerializerOperationBehavior.Reflector.EnsureMessageInfos()
at System.ServiceModel.Description.XmlSerializerOperationBehavior.CreateFormatter()
at System.ServiceModel.Description.XmlSerializerOperationBehavior.System.ServiceModel.Description.IOperationBehavior.ApplyClientBehavior(OperationDescription description, ClientOperation proxy)
at System.ServiceModel.Description.DispatcherBuilder.BindOperations(ContractDescription contract, ClientRuntime proxy, DispatchRuntime dispatch)
at System.ServiceModel.Description.DispatcherBuilder.ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime clientRuntime)
at System.ServiceModel.Description.DispatcherBuilder.BuildProxyBehavior(ServiceEndpoint serviceEndpoint, BindingParameterCollection& parameters)
at System.ServiceModel.Channels.ServiceChannelFactory.BuildChannelFactory(ServiceEndpoint serviceEndpoint, Boolean …Run Code Online (Sandbox Code Playgroud) 读取 - 复制 - 更新(RCU)是一种手动内存管理技术,在Linux内核中越来越流行.
是否有可能设计一种使用RCU而不是传统垃圾收集器的语言和VM来回收无法访问的内存?
f# ×6
.net ×4
c# ×3
algorithm ×1
database ×1
dictionary ×1
dynamic ×1
graph ×1
haskell ×1
immutability ×1
parsing ×1
performance ×1
persistence ×1
rcu ×1
rest ×1
soap ×1
syntax ×1
web-services ×1