在Haskell中,与许多其他函数语言一样,函数foldl被定义为例如foldl (-) 0 [1,2,3,4] = -10.
这没关系,因为foldl (-) 0 [1, 2,3,4]根据定义,((((0 - 1) - 2) - 3) - 4).
但是,在Racket中,(foldl - 0 '(1 2 3 4))是2,因为Racket"智能地"计算如下:(4 - (3 - (2 - (1 - 0)))),确实是2.
当然,如果我们定义辅助功能翻转,像这样:
(define (flip bin-fn)
  (lambda (x y)
    (bin-fn y x)))
Run Code Online (Sandbox Code Playgroud)
然后我们可以在Racket中实现与Haskell相同的行为:而不是(foldl - 0 '(1 2 3 4))我们可以写:(foldl (flip -) 0 '(1 2 3 4))
问题是:为什么foldl球拍以这种奇怪的(非标准的,非直观的)方式定义,与其他语言不同?
在Peter Seibel的书"Practical Common Lisp"中,我们可以找到一次非常复杂的宏的定义(参见页面底部http://www.gigamonkeys.com/book/macros-defining-your-own.html).
我在过去3周内第10次阅读这个宏定义,无法理解它是如何工作的.:(更糟糕的是,我不能自己开发这个宏,即使我理解它的目的以及如何使用它.
我对这个臭名昭着的宏观系统"衍生"特别感兴趣,一步一步!有帮助吗?
在Common Lisp中,创建宏定义宏相对容易.例如,以下宏
(defmacro abbrev (short long)
  `(defmacro ,short (&rest args)
     `(,',long ,@args)))
Run Code Online (Sandbox Code Playgroud)
是一个宏定义宏,因为它扩展到另一个宏.
如果我们现在放
(abbrev def defun) 
Run Code Online (Sandbox Code Playgroud)
在我们的程序中,我们可以编写def而不是defun在定义新函数时.当然,abbrev也可以用于其他事情.例如,之后
(abbrev /. lambda)
Run Code Online (Sandbox Code Playgroud)
我们可以写(/. (x) (+ x 1))而不是(lambda (x) (+ x 1)).尼斯.(有关缩写的详细说明,请参阅http://dunsmor.com/lisp/onlisp/onlisp_20.html)
现在,我的问题是:
abbrev在Racket中编写类似于
 宏的内容?)有没有人能够配置Sublime Text 2和SublimeRepl来配合鸡计划?
我在Sublime中有鸡的repl,但它只显示来自鸡方案的错误消息(可能来自csi进程的stderr输出),但它不显示提示或评估值.
有帮助吗?
scheme read-eval-print-loop sublimetext2 chicken-scheme sublimerepl
最近,我遇到了著名的茱莉亚语言作者杰夫·贝赞森(Jeff Bezanson)撰写的一种称为femtolisp的小口齿方言。(有关femtolisp的更多信息,请访问https://code.google.com/p/femtolisp/和https://github.com/JeffBezanson/femtolisp),我真的很喜欢。
但是,我想知道是否有某种方法可以从femtolisp调用C函数?
当我运行此代码时,我得到这个结果:
15
15
Run Code Online (Sandbox Code Playgroud)
我希望输出应该是
15
17
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.问题是:为什么?
def make_adder_and_setter(x):
    def setter(n):
        x = n
    return (lambda y: x + y, setter)
myadder, mysetter = make_adder_and_setter(5)
print myadder(10)
mysetter(7)
print myadder(10)
Run Code Online (Sandbox Code Playgroud) 如何构造segs返回列表中所有连续段列表的函数?例如,(segs '(l i s t))应该产生以下答案:
(() (t) (s) (s t) (i) (i s) (i s t) (l) (l i) (l i s) (l i s t))
Run Code Online (Sandbox Code Playgroud)
我对如何按照HtDP中描述的设计原则解决这个问题特别感兴趣(不,这不是书中的问题,所以请随时讨论它!)如何解决?在程序推导中使用哪些原则?
在链接http://www.ccs.neu.edu/home/ryanc/macro-stepper/tutorial.html上有关于使用宏步进器的说明.
但是,当我要尝试它时,我无法在非零的定义中得到myor的第二次扩展?功能,只有第一个.另外,我没有按钮"上一学期"和"下一学期".
所以我的问题是:我如何配置宏步进器以获得第二次扩展,就像在教程中一样?
我刚刚编写了函数add-registers,用于在Racket中添加两个n位寄存器(使用bit-add函数作为帮助器):
(define (bit-add x y c)
  (values (bitwise-xor x y c) (bitwise-ior (bitwise-and x y)
                                           (bitwise-and x c)
                                           (bitwise-and y c))))
(define (add-registers xs ys)
  (let ([carry 0])
    (values (reverse (for/list ([b1 (reverse xs)] [b2 (reverse ys)])
                       (let-values ([(nb nc) (bit-add b1 b2 carry)])
                         (set! carry nc)
                         nb)))
            carry)))
Run Code Online (Sandbox Code Playgroud)
但我发现我的代码非常难看.所以我想知道这是否可以写得更简洁优雅?
我想知道是否可以在Racket中编写一个可以转换每种形状的宏(c(a | d)+ r xs),其中c(a | d)+ r是匹配car,cdr,caar的正则表达式,干部,......等,先进入相应的组成和休息.
例如,这个宏应该采用(caadr'(1 2 3 4 5))并将其转换为(first(first(rest'(1 2 3 4 5)))).
沉(Mark Tarver的新编程语言)中有类似的东西:https://groups.google.com/group/qilang/browse_thread/thread/131eda1cf60d9094?hl = en
racket ×6
scheme ×5
macros ×4
lisp ×3
common-lisp ×2
recursion ×2
closures ×1
cons ×1
expansion ×1
femtolisp ×1
fold ×1
hygiene ×1
julia ×1
python ×1
python-2.x ×1
recurrence ×1
sublimerepl ×1
sublimetext2 ×1