什么是使用JS自己的类型编译为简短,可读和可修改的JS的lisp方言?
我试图扩大可选省略号(~optional datum:my-class ...)成一种形式,使用从属性,my-class像这样:#'(list datum.attr ...)。
但是由于表单是可选的,因此当表单不存在时,它将解析为#f,省略号模式不喜欢它:
;; ?: attribute contains non-list value
;; value: #f
Run Code Online (Sandbox Code Playgroud)
我尝试使用的#:defaults参数~optional,如下所示:
(~optional datum:my-class ... #:defaults ([(datum 1) null]))
Run Code Online (Sandbox Code Playgroud)
;; which works for usage:
#'(list datum ...)
;; but not for:
#'(list datum.attr ...)
Run Code Online (Sandbox Code Playgroud)
我通过使用以下技巧使它起作用:
(~optional datum:my-class ...)
#'(list #,@(if (attribute datum) #'(datum.attr ...) #'()))
Run Code Online (Sandbox Code Playgroud)
我正在尝试寻找是否有更好的方法。
我尝试将其保持在最低限度。检出测试子模块。要查看此问题,请取消注释parse-bag和运行的四个实现之一raco test file.rkt。
#lang racket/base
(provide parse-bag)
(require
(for-syntax racket/base syntax/parse) …Run Code Online (Sandbox Code Playgroud) 我一直在读关于如何使用Racket进行学术研究,但我在寻找商业和/或初创企业的商业成功案例时遇到了问题.有没有人在商业上使用Racket取得任何成功,还是我在错误的树上咆哮?我问,因为我有一个启动的想法,目前正在评估语言和工具.
我试图运行(http://mitpress.mit.edu/sicp/full-text/book/book-ZH-26.html)在SICP 4.1中所述的程序,但已经在重新定义函数碰到一些困难,apply如这本书暗示你这样做.代码如下:
#lang planet neil/sicp
;; -----------------------------------------------------------------------------
;; 4.1.1 The Core of the Evaluator
;; -----------------------------------------------------------------------------
;; Eval
(define apply-in-underlying-scheme apply)
(define (eval exp env)
(display 'eval)
(newline)
(display exp)
(newline)
(cond ((self-evaluating? exp) exp)
((variable? exp) (let ((res (lookup-variable-value exp env)))
(display (list 'lookup exp))
(newline)
(display res)
(newline)
res))
((quoted? exp) (text-of-quotation exp))
((assignment? exp) (eval-assignment exp env))
((definition? exp) (eval-definition exp env))
((if? exp) (eval-if exp env))
((lambda? exp)
(make-procedure (lambda-parameters exp)
(lambda-body exp)
env)) …Run Code Online (Sandbox Code Playgroud) 我是Scheme(通过Racket)和(在较小程度上)函数式编程的新手,并且可以通过变量和递归使用一些关于积累的优缺点的建议.出于本示例的目的,我正在尝试计算移动平均线.因此,对于列表'(1 2 3 4 5),3期移动平均线将是'(1 2 2 3 4).我们的想法是,期间之前的任何数字都不是计算的一部分,一旦我们达到集合中的期间长度,我们就会根据所选择的期间开始对列表的子集进行平均.
所以,我的第一次尝试看起来像这样:
(define (avg lst)
(cond
[(null? lst) '()]
[(/ (apply + lst) (length lst))]))
(define (make-averager period)
(let ([prev '()])
(lambda (i)
(set! prev (cons i prev))
(cond
[(< (length prev) period) i]
[else (avg (take prev period))]))))
(map (make-averager 3) '(1 2 3 4 5))
> '(1 2 2 3 4)
Run Code Online (Sandbox Code Playgroud)
这有效.我喜欢使用地图.它看起来很容易构建并且可以重构.我可以在将来看到堂兄弟像:
(map (make-bollinger 5) '(1 2 3 4 5))
(map (make-std-deviation 2) '(1 2 3 …Run Code Online (Sandbox Code Playgroud) 我注意到人们经常表现得像Stack Overflow上的Scheme和Racket一样(以及网络上的其他地方.例如,关于Scheme的问题经常在Racket中生成解决方案.如果你看一下标记方案的问题,你会看到他们的答案的一半开始#lang racket.
这两种语言真的如此相似,以至于它们可以被认为是平等的吗?Racket只是Scheme的扩展(即Scheme代码总是在Racket解释器上运行)?
我想强调一个事实,即这不是一个论战,只是一个学习Scheme编程语言的人的问题.
我的公司正在设计一种新的特定于域的脚本语言; 我必须实现一个解析器,将我们全新的编程语言转换为通用的脚本语言,以便能够实现它.
我这样做的通常方法是通过生成翻译器代码的工具Bison和Flex工具C/C++.
对于大多数主流编程语言,我找到了其他工具,但没有找到Lisp.
没有Lisp曾经被使用是什么?编写解析器的常用方法是什么Lisp?
注意:对我来说,任何Lisp可能有帮助的实现/方言都可以,我没有任何偏好.
根据文档eval和eval-syntax行为相同,异常eval 丰富了输入语法.
如果top-level-form是一个语法对象,其基准不是编译形式,那么它的词汇信息在被发送到评估处理程序之前会被丰富:
与eval类似,除了stx必须是语法对象,并且它的词汇上下文在传递给求值处理程序之前不会被丰富.
我很难理解这意味着什么.我得到的印象是以某种方式涉及命名空间,但我无法想出一个示例程序,其中eval和eval-syntax的行为不同.(当给出语法对象时.)
那么怎么做eval和eval-syntax有所不同,或者至少你能给我一个样本程序,让他们表现出不同的行为?
在构建列表时,描述第一个典型元素,然后将其纳入自然递归.
"自然递归"的确切定义是什么?我问的原因是因为我正在接受Daniel Friedman的编程语言原则课程,以下代码不被认为是"自然递归":
(define (plus x y)
(if (zero? y) x
(plus (add1 x) (sub1 y))))
Run Code Online (Sandbox Code Playgroud)
但是,以下代码被认为是"自然递归":
(define (plus x y)
(if (zero? y) x
(add1 (plus x (sub1 y)))))
Run Code Online (Sandbox Code Playgroud)
我更喜欢"非自然递归"代码,因为它是尾递归的.但是,这样的代码被认为是诅咒.当我问到为什么我们不应该以尾递归形式编写函数时,副教师简单地回答说:"你不要乱用自然递归."
以"自然递归"形式编写函数有什么好处?
(defun triangle-using-cond (number)
(cond
((<= number 0) 0) ; 1st
((= number 1) 1) ; 2nd
((> number 1) ; 3rd
;; 4th
(+ number
(triangle-using-cond (1- number))))))
Run Code Online (Sandbox Code Playgroud)
关于康德的事情
我无法区分的一件事是cond与函数有什么不同!