我Guile 1.8.8
在OS X的口译员中练习Scheme .我发现了一些有趣的东西.
这里的expt
函数基本上是取幂的expt(b,n) = b^n
:
(define (square x) (* x x))
(define (even? x) (= (remainder x 2) 0))
(define (expt b n)
(cond ((= n 0) 1)
((even? n) (square (expt b (/ n 2))))
(else (* b (expt b (- n 1))))
))
Run Code Online (Sandbox Code Playgroud)
如果我尝试一些输入
> (expt 2 10)
1024
> (expt 2 63)
9223372036854775808
Run Code Online (Sandbox Code Playgroud)
这是一个奇怪的部分:
> (expt 2 64)
0
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,直到n=488
它停留在0
:
> (expt 2 487)
0 …
Run Code Online (Sandbox Code Playgroud) 我正在学习Emacs Lisp,我遇到了这个十年前的帖子,说在某些时候Guile(Scheme)将取代Emacs Lisp,或者Emacs将被Guile重写.
https://web.archive.org/web/20081201143448/http://sanpietro.red-bean.com/guile/guile/old/3114.html
我想知道这是否还有可能,并且开发人员是否应该尝试用这个来编写Elisp?最初的目标是让Guile向后兼容Elisp,但似乎开发Scheme是更好的选择.
我有一堆"传统"Guile Scheme代码,我想在Racket Scheme IDE中运行.似乎有足够的差异使这成为一项非平凡的工作.(我的计划知识水平是完成The Little Schemer的水平).
我的问题是:
附加:(对Racket Scheme和R5RS/R6RS之间的分歧感到满意) - 我想要的是在Racket IDE中运行'某些东西 - 而不是Racket语言.
+
在使用的方案程序中重新定义运算符时,我收到了意外的结果guile
.我应该指出,这是在尝试理解语言时发生的; 这里没有尝试编写有用的程序.
这是代码:
(define (f a b) 4)
(define (show)
(display (+ 2 2)) (display ",") (display (f 2 2)) (newline))
(show)
; guile & mit-scheme: "4,4"
(define (+ a b) 5)
(define (f a b) 5)
(show)
; mit-scheme: "5,5"
; guile: "4,5" - this "4" is the unexpected result
(define (show)
(display (+ 2 2)) (display ",") (display (f 2 2)) (newline))
(show)
; guile & mit-scheme: "5,5"
Run Code Online (Sandbox Code Playgroud)
在guile
函数中show
使用了预定义的定义,+
即使在我重新定义它之后,它也使用了新的定义 …
当我输入guile或mzscheme的REPL时
(define x 15)
Run Code Online (Sandbox Code Playgroud)
然后按箭头键我得到(定义x 15)^ [[D.
这是一个终端问题吗?或者需要配置什么?为简单的编辑重写一行是很痛苦的
我想将带有源的目录与带有目标的目录分开。似乎从 Makefile 更改当前工作目录应该是最简单的解决方案。
由于以下缺点,明确的目标路径是不够的:
另请参阅Pauls 的规则 #3:
如果目标构建在当前工作目录中,那么生活是最简单的。
关于 VPATH——我也同意要求开发人员“在运行 make 之前切换到目标目录是一种痛苦”。
从gimp.org下载使用Gimp 2.6.6 for MAC OS X(在X11下).
我正在尝试使用Script-Fu自动化无聊的手动过程.我需要解析图像文件名以使用原始文件名上的后缀将各种图层保存为新文件.
我最初的尝试是这样的,但失败了,因为(string-search ...)
似乎在2.6下没有(脚本引擎的更改?).
(set! basefilename (substring filename 0 (string-search "." filename)))
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用此信息使用正则表达式解析基本文件名,但(re-match-nth ...)
也无法识别.
(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
(set! basefilename (re-match-nth orig-name buffer 1))
)
Run Code Online (Sandbox Code Playgroud)
虽然从向量中拉出值没有错误,但在传入时,结果值不会被视为字符串(string-append ...)
.
(if (re-match "^(.*)[.]([^.]+)$" filename buffer)
(set! basefilename (vector-ref buffer 1))
)
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是,我将如何解析基本文件名?
我正在学习Guile Scheme,在文档中我突然遇到了以下构造:
((lambda args (display args)) 42)
=> (42)
Run Code Online (Sandbox Code Playgroud)
这让我陷入了困境; 直到这一点,我假设正式参数始终包含在列表中:
((lambda (args) (display args)) 42)
=> 42
Run Code Online (Sandbox Code Playgroud)
我想知道何时使用这个变体,以及它如何与可变数量的参数的点表示法不同.具体来说,以下两个变体之间有什么区别:
((lambda args (display args)) 1 2 3) => (1 2 3)
((lambda (. args) (display args)) 1 2 3) => (1 2 3)
Run Code Online (Sandbox Code Playgroud)
是否存在差异 - 也许是为了更复杂的例子 - 我需要注意并且是否有理由更喜欢一个而不是另一个?
我试图在诡计中使用 srfi-1。我使用以下代码来包含 srfi:
(use-modules (srfi srfi-1))
但是,我收到一条错误消息,说 srfi 可能未定义。我应该如何使用srfi?
我试着用谷歌搜索这个问题,但似乎我是第一个遇到这个问题的人。