曾几何时,为了编写x86汇编程序,你会得到一条说明"加载EDX寄存器的值为5","递增EDX"寄存器等的指令.
对于具有4个核心(甚至更多)的现代CPU,在机器代码级别上它看起来就像有4个独立的CPU(即只有4个不同的"EDX"寄存器)?如果是这样,当你说"递增EDX寄存器"时,是什么决定了哪个CPU的EDX寄存器递增?现在x86汇编程序中是否存在"CPU上下文"或"线程"概念?
核心之间的通信/同步如何工作?
如果您正在编写操作系统,那么通过硬件公开哪种机制可以让您在不同的内核上安排执行?这是一些特殊的特权指示吗?
如果您正在为多核CPU编写优化编译器/字节码VM,那么您需要具体了解x86,以使其生成能够在所有内核中高效运行的代码?
对x86机器代码进行了哪些更改以支持多核功能?
在C#/ .NET中创建空文件的最简单/规范方法是什么?
到目前为止我能找到的最简单的方法是:
System.IO.File.WriteAllLines(filename, new string[0]);
Run Code Online (Sandbox Code Playgroud) 我最近注意到的一个短语是"无点"风格的概念......
然后,我在这里发现他们提到"另一个可能值得讨论的话题是作者不喜欢点自由风格."
什么是"免费"风格?有人可以给出简明的解释吗?它与"自动"曲线有关吗?
为了了解我的水平 - 我一直在教自己Scheme,并编写了一个简单的Scheme解释器...我理解"隐含"currying是什么,但我不知道任何Haskell或ML.
我有一个System.Type实例,其中"IsArray"返回true.
如何确定数组类型的"嵌套类型"?
即
Type GetArrayType(Type t)
{
if(t.IsArray)
{
// What to put here?
}
throw new Exception("Type is not an array");
}
Assert.That(GetArrayType(typeof(string[])), Iz.EqualTo(typeof(string));
Assert.That(GetArrayType(typeof(Foo[])), Iz.EqualTo(typeof(Foo));
Run Code Online (Sandbox Code Playgroud) 我正在尝试用C#编写一个非常简单的解析器.
我需要一个词法分析器 - 让我将正则表达式与标记相关联的东西,所以它读取正则表达式并给我回符号.
看起来我应该能够使用正则表达式进行实际繁重的工作,但我看不出一个简单的方法.首先,Regex似乎只能处理字符串,而不是流(为什么会这样!?!?).
基本上,我想要一个以下接口的实现:
interface ILexer : IDisposable
{
/// <summary>
/// Return true if there are more tokens to read
/// </summary>
bool HasMoreTokens { get; }
/// <summary>
/// The actual contents that matched the token
/// </summary>
string TokenContents { get; }
/// <summary>
/// The particular token in "tokenDefinitions" that was matched (e.g. "STRING", "NUMBER", "OPEN PARENS", "CLOSE PARENS"
/// </summary>
object Token { get; }
/// <summary>
/// Move to the next token …
Run Code Online (Sandbox Code Playgroud) 我一直在阅读SICP(计算机程序的结构和插入)并且非常兴奋地发现这种奇妙的特殊形式:"make-environment",他们证明它与eval结合使用作为编写模块化代码的一种方式(摘录)关于"包裹"的第4.3节:
(define scientific-library
(make-environment
...
(define (square-root x)
...)))
Run Code Online (Sandbox Code Playgroud)
然后他们演示了它的工作原理
((eval 'square-root scientific-library) 4)
Run Code Online (Sandbox Code Playgroud)
在他们的榜样,他们然后去证明正是我想要的使用-在计划做"OO"风格的优雅简约的方式......他们"利弊"在一起"类型",这实际上是什么由"make-environment"特殊形式(即vtable)和arg("the state")返回...
我非常兴奋,因为这正是我一直在寻找的一种方法,可以在Scheme中"按符号"进行多态调度,而无需编写大量显式代码或宏.
即我想创建一个"对象",其中包含两个函数,我在不同的上下文中调用...但我不想通过"car"和"cdr"来引用它们,我想两个都声明并用它们的象征性名称来评估它们.
无论如何,当我读到这篇文章时,我迫不及待想回家试试看.
想象一下,当我在PLT计划和Chez计划中经历以下事件时,我感到很失望:
> (make-environment (define x 3))
Error: invalid context for definition (define x 3).
> (make-environment)
Error: variable make-environment is not bound.
Run Code Online (Sandbox Code Playgroud)
在SICP中引用了"make-environment"怎么了?这一切看起来都很优雅,正是我想要的,但它似乎并没有得到任何现代Scheme解释器的支持?
理由是什么?简单地说"make-environment"有不同的名字吗?
稍后会发现更多信息
我看了看在线版:
http://mitpress.mit.edu/sicp/full-text/book/book-ZH-28.html#%_sec_4.3
我正在阅读的是SICP的第一版.第二版似乎已经用关于非确定性编程和"放大器"运算符的部分取代了关于包的讨论.
我试图在这里理解SICP中描述的统一算法
特别是,在"尽可能扩展"的过程中,有一个检查(标有星号"*"的第一个地方),它检查右手"表达式"是否是已经绑定到某个东西的变量.当前帧:
(define (extend-if-possible var val frame)
(let ((binding (binding-in-frame var frame)))
(cond (binding
(unify-match
(binding-value binding) val frame))
((var? val) ; *** why do we need this?
(let ((binding (binding-in-frame val frame)))
(if binding
(unify-match
var (binding-value binding) frame)
(extend var val frame))))
((depends-on? val var frame)
'failed)
(else (extend var val frame)))))
Run Code Online (Sandbox Code Playgroud)
相关评论指出:
"在第一种情况下,如果我们尝试匹配的变量没有绑定,但我们试图匹配它的值本身就是一个(不同的)变量,有必要检查该值是否绑定,并且如果是的话,要匹配它的价值.如果比赛的双方都没有约束,我们可能会绑定到另一方."
但是,我想不出这实际上是必要的情况.
我认为,它正在谈论的是你目前可能有以下框架绑定的地方:
{?y = 4}
Run Code Online (Sandbox Code Playgroud)
然后要求"extendIfPossible"绑定从?z到?y.
当出现"*"检查时,当被要求用"?y"扩展"?z"时,我们看到"?y"已经绑定到4,然后递归地尝试将"?z"与"4"统一,这导致我们用"?z = 4"扩展框架.
没有检查,我们最终只用"?z =?y"扩展框架.但在这两种情况下,只要?z还没有被其他东西绑定,我就没有看到问题.
请注意,如果- Z 就已经被绑定到别的东西,然后代码没有达到部分标有"*"(我们早就递归到什么?ž统一已经匹配).
经过深思熟虑之后,我意识到可能存在某种形式的争论,即生成一个"最简单"的MGU(Most General Unifier).例如,您可能希望MGU具有引用其他变量的最少数量的变量...也就是说,我们宁愿生成替换{?x = 4,?y …
考虑以下Haskell函数:
sign a
| a < 0 = (-1)
| a > 0 = 1
| otherwise = 0
Run Code Online (Sandbox Code Playgroud)
当我把它加载到ghci我希望:t sign
是:
sign :: (Num a, Ord a) => a -> Integer
Run Code Online (Sandbox Code Playgroud)
相反,它推断为:
*Main> :t sign
sign :: (Num a1, Num a, Ord a1) => a1 -> a
Run Code Online (Sandbox Code Playgroud)
同样,如果我要求整数的类型5
,我期望Integer
,但我得到了
*Main> :t 5
5 :: Num a => a
Run Code Online (Sandbox Code Playgroud)
我不了解Haskell的类型.问题是,如果我所知道的返回类型sign
是它是Num
类型类的一个实例,那么我不应该将它的返回值传递给这个函数:
double :: Integer -> Integer
double x = x * 2
Run Code Online (Sandbox Code Playgroud)
也就是说,我的 …
有很多Linq算法只需要通过输入一次,例如Select.
然而,所有Linq扩展方法都位于IEnumerable而不是IEnumerator上
var e = new[] { 1, 2, 3, 4, 5 }.GetEnumerator();
e.Select(x => x * x); // Doesn't work
Run Code Online (Sandbox Code Playgroud)
这意味着您无法在任何正在读取"已打开"的流的情况下使用Linq.
对于我目前正在处理的项目,这种情况发生了很多 - 我想返回一个IEnumerator,其IDispose方法将关闭流,并让所有下游Linq代码对此进行操作.
简而言之,我有一个"已经打开"的结果流,我可以将其转换为适当的一次性IEnumerator - 但不幸的是,所有下游代码都需要IEnumerable而不是IEnumerator,即使它只会执行一次"传递".
即我想在各种不同的来源(CSV文件,IDataReaders等)上"实现"这种返回类型:
class TabularStream
{
Column[] Columns;
IEnumerator<object[]> RowStream;
}
Run Code Online (Sandbox Code Playgroud)
为了获得"列",我必须已经打开了CSV文件,启动了SQL查询,或者其他什么.然后我可以返回一个"IEnumerator",其Dispose方法关闭资源 - 但所有Linq操作都需要一个IEnumerable.
我所知道的最好的解决方法是实现一个IEnumerable,其GetEnumerator()方法返回唯一的IEnumerator,如果某些东西试图进行两次GetEnumerator()调用,则会抛出错误.
这一切听起来还不错,还是有更好的方式让我以一种易于使用Linq的方式实现"TabularStream"?
我正在尝试检测Type对象的特定实例是否是通用的"IEnumerable"...
我能想到的最好的是:
// theType might be typeof(IEnumerable<string>) for example... or it might not
bool isGenericEnumerable = theType.GetGenericTypeDefinition() == typeof(IEnumerable<object>).GetGenericTypeDefinition()
if(isGenericEnumerable)
{
Type enumType = theType.GetGenericArguments()[0];
etc. ...// enumType is now typeof(string)
Run Code Online (Sandbox Code Playgroud)
但这似乎有点间接 - 是否有更直接/更优雅的方式来做到这一点?