这是clojure的定义vector:
(defn vector
"Creates a new vector containing the args."
{:added "1.0"
:static true}
([] [])
([a] [a])
([a b] [a b])
([a b c] [a b c])
([a b c d] [a b c d])
([a b c d & args]
(. clojure.lang.LazilyPersistentVector (create (cons a (cons b (cons c (cons d args))))))))
Run Code Online (Sandbox Code Playgroud)
为什么会有这么多案件?或者,如果有这么多,为什么还有更多呢?
我的猜测是它在实现效率和概率之间达到了平衡,但我不太清楚这是如何更有效的.
我正在阅读C++编程语言,其中Stroustrup声明char的int值可以在0到255或-127到127之间,具体取决于实现.它是否正确?它似乎应该是从-128到127.如果不是,为什么在第二种实现可能性中它们只有255个可能的值,而不是256.
是否有R5RS或更高版本的Scheme实现并行化?例如,如果我说要这样做:
(map (lambda (x)
(pure-functional-stuff x))
'(1 3 5 7 11 13))
Run Code Online (Sandbox Code Playgroud)
如果机器可以同时处理1,3,5和7?这应该是函数式编程的一大优势,但我无法找到一个维护的,最新的方案来实现它.除非我断言该函数没有副作用,否则我会对那些不会并行化的它很好.
lisp parallel-processing scheme functional-programming language-implementation
在这个流行的问题中,为什么substring在C#中占用O(n),所提出的主要答案之一认为,如果分配了一个大数组,并且通过让新字符串仅引用数组的一小部分来计算子字符串,那么垃圾收集器就会即使原始字符串不再被引用,也无法回收包含较大字符串的字符数组.
这似乎是一个非常有效的答案,但似乎理论上可以为数组构建一个垃圾收集器,允许对大多数数组进行垃圾收集,同时留下一些仍在使用的小型子数组.换句话说,如果有一个50,000个元素的数组,其中只有一个小的100个元素的片仍然在使用,垃圾收集器可以将数组分成三个部分--100个元素切片之前的元素,100个元素切片本身,以及100个元素切片之后的元素 - 然后垃圾收集这些碎片的第一个和最后一个.
我的问题是,任何语言实现是否实际使用这种垃圾收集器,或者它是否仅在理论上存在.有没有人知道一个像这样的垃圾收集器的语言实现的例子?
假设您正在为便携式C编译函数式语言,并且假设由于各种原因您需要精确而非保守的垃圾收集.对于垃圾收集器来说,没有可移植的方法(在一般情况下可能完全没有办法)来弄清楚什么是C堆栈上的指针而不是指针.在我看来,这个问题有两个解决方案:
影子堆栈.使每个C函数保持关于什么是指针和不是指针的簿记信息.这是LLVM推荐的方法.
利用您正在编译函数式语言的事实,这意味着主线代码没有副作用.当分配器检测到内存不足时,不是调用垃圾收集器本身,而是使用longjmp将当前操作中止回主循环,主循环调用垃圾收集器(在可能包含指针的变量集已知的上下文中)提前)然后重新开始操作.
在我看来,如果你正在处理第二种方法适用的纯函数式语言,它必须比第一种方法更有效,并且更容易与手写的C语言混合.
我有什么问题可以忽略吗?对此技术的现有讨论或实现的任何引用?
c compiler-construction garbage-collection functional-programming language-implementation
我正在寻找memcpy.c的实现,我发现了一个不同的memcpy代码.我无法理解他们为什么这样做(((地址)s)|((ADDRESS)d)| c)&(sizeof(UINT) - 1)
#if !defined(__MACHDEP_MEMFUNC)
#ifdef _MSC_VER
#pragma function(memcpy)
#undef __MEMFUNC_ARE_INLINED
#endif
#if !defined(__MEMFUNC_ARE_INLINED)
/* Copy C bytes from S to D.
* Only works if non-overlapping, or if D < S.
*/
EXTERN_C void * __cdecl memcpy(void *d, const void *s, size_t c)
{
if ((((ADDRESS) s) | ((ADDRESS) d) | c) & (sizeof(UINT) - 1)) {
BYTE *pS = (BYTE *) s;
BYTE *pD = (BYTE *) d;
BYTE *pE = (BYTE *) (((ADDRESS) s) + c); …Run Code Online (Sandbox Code Playgroud) 我知道使用协同程序作为基础并实现玩具调度程序的基础知识.但我认为这是关于整体异步调度程序的过于简化的观点.我的想法中缺少一整套漏洞.
如何防止cpu运行正在运行空闲/等待的调度程序?有些光纤只是睡觉,有些则等待来自操作系统的输入.
这是一个关于宏的理论问题(我认为).我知道宏可以获取源代码并生成目标代码而无需对其进行评估,从而使程序员能够创建更多功能的语法结构.如果我必须对这两个宏系统进行分类,我会说有"C风格"宏和"Lisp风格"宏.
调试宏似乎有点棘手,因为在运行时,实际运行的代码与源代码不同.
调试器如何根据预处理的源代码跟踪程序的执行情况?是否有一个特殊的"调试模式"必须设置为捕获有关宏的额外数据?
在C中,我可以理解你为调试设置了一个编译时开关,但是解释语言(如某些形式的Lisp)会怎么做呢?
为不尝试这一点而道歉,但是lisp工具链需要的时间比我花费的时间要多.
我想在Haskell中用标识符中的Unicode字符(非拉丁语)编写一些教育代码.(因此,对于除英语之外的自然语言的说话者而言,标识符看起来不错且自然,在写作中没有使用拉丁字符.)因此,我开始寻找适当的Haskell实现来实现这一点.
但是语言规范中指定了哪个功能?在寻找符合要求的实现时,我将如何引用此功能?(已知哪些Haskell实现支持Unicode标识符?)
事实证明,一个Haskell实现确实接受了带有Unicode标识符的代码,而另一个Hatsell实现未能接受它.我希望如果有一种方法可以用语言特征切换的形式来形式化我的代码的这个要求,那么如果我或其他人试图运行我的代码,那么将立即清楚他的实现是否缺失所需的功能,因此他应该寻找另一个.(可能还有一个用于此功能的维基页面 - "Unicode标识符",它将列出哪些现有实现支持它,以便在需要时可以知道去哪里.)
(顺便说一下,我在这个问题上加上了一个"语法"标签,但我实际上认为它是一个lexing级别的问题,比语言的语法更低.这里有一个标签用于lexing的特征语言的级别,而不是语言的语法规范的功能?)
syntax multilingual haskell language-implementation language-specifications
假设我们想sum在Haskell中编写自己的函数:
sum' :: (Num a) => [a] -> a
sum' [] = 0
sum' (x:xs) = x + sum' xs
Run Code Online (Sandbox Code Playgroud)
为什么我们不能这样做:
sum' :: (Num a) => [a] -> a
sum' [] = 0
sum' (xs++[x]) = x + sum' xs
Run Code Online (Sandbox Code Playgroud)
换句话说,为什么我们不能++在模式匹配中使用?