我一直在学习 SICP,我想应用我迄今为止学到的一些概念。也就是说,积累、映射和过滤将帮助我提高工作效率。我主要使用 CSV 文件,并且我知道 MIT/GNU 方案不支持这种文件格式。但这没关系,因为我可以将 CSV 文件导出到 txt 文件,因为支持 txt 文件。
现在我阅读了手册的第 14 节输入/输出,坦率地说,缺乏具体的示例并不能帮助我入门。因此,我希望你们中的一些人能给我一个良好的开端。我有一个文本文件 foo.txt,其中包含国家列表的变量和观察结果。我只想将这个文件读入Scheme并操作数据。感谢您的帮助。任何示例代码都会有所帮助。
通常在终端(或我以前使用过的任何其他命令提示符)中,我会按向上键来获取最后输入的命令。然而,当在guile解释器中这样做时,我只是得到:
scheme@(guile-user) [1]> ^[[A
Run Code Online (Sandbox Code Playgroud)
获取 guile 中最后输入的命令的最简单方法是什么?
LISP 语言(或特别是 Racket)中是否有任何内置函数可以像 map 一样工作,但将元素的索引作为参数之一传递给映射函数?
此类函数的示例是:
(define map-index (lambda (func list)
(map func list (build-list (length list) (lambda (i) i)))))
;usage:
> (map-index cons '(a b c d))
;output:
'((a . 0) (b . 1) (c . 2) (d . 3))
Run Code Online (Sandbox Code Playgroud)
显然,这不是一个非常有效的实现,并且不支持多个列表作为参数,就像常规映射一样。
如果两个布尔值相同,则两个布尔值相等,两个数字相似。如果两个集合具有相同的元素,则它们相等。如果检查两组是否相等,我们可以使用以下方案/球拍函数:
\n\n(define (same-set? l1 l2)\n (and (subset? l1 l2) (subset? l2 l1)))\nRun Code Online (Sandbox Code Playgroud)\n\n那么这样的函数是如何自动生成的呢?可以为任意数据类型生成它吗?
\n\n等价关系的基本性质是:
\n\n替换性质:对于任意数量a和b以及任意表达式F(x),如果a = b,则F(a) = F(b)(如果两边都有意义,即格式良好)。\n一些具体例子其中:
\n\n对于任何实数a、b和c,如果a = b,则a + c = b + c(这里F(x)是x + c);
\n\n对于任何实数 a、b 和 c,如果 a = b,则 a \xe2\x88\x92 c = b \xe2\x88\x92 c (这里 F(x) 是 x \xe2\x88\x92 c) ;
\n\n对于任何实数a、b和c,如果a = b,则ac = bc(这里F(x)是xc);
\n\n对于任何实数 a、b 和 c,如果 a = b 且 c 不为零,则 a/c = b/c(此处 F(x) 为 x/c)。 …
我正在尝试定义一个函数func->symbol,该函数接受一个函数并将其名称作为符号返回。例如:
(define (pythagoras a b)
(sqrt (+ (* a a) (* b b))))
;; #1
(func->symbol pythagoras) ; Returns: 'pythagoras
;; #2
(func->symbol (if #t pythagoras sqrt)) ; Returns: 'pythagoras
;; #3
(let ((f (if #t pythagoras sqrt)))
(func->symbol f)) ; Returns: 'pythagoras
;; #4
(let ((f (if #t pythagoras sqrt)))
(let ((g f))
(func->symbol g))) ; Returns: 'pythagoras
Run Code Online (Sandbox Code Playgroud)
这是关于如何获取定义名称作为符号的后续问题?它只处理情况#1。对于情况#1,一个简单的宏def->symbol就足够了:
(define-syntax def->symbol
(syntax-rules ()
((_ def) 'def)))
Run Code Online (Sandbox Code Playgroud)
然而,这个宏定义不通过情况#2、#3、#4。是否可以定义func->symbol,或者 Scheme 对此表达能力不够?
新年快乐!
我正在努力进入 Racket(我不是一个经验丰富的 Lisper)。
现在我在 Racket 8.3 中遇到了以下内容:
#lang racket
> (define str1 "hello")
> (define str2 "hello")
> (eq? str1 str2)
#t
Run Code Online (Sandbox Code Playgroud)
我期待#f像这里一样。在 Guile 和 Common Lisp 中,这被返回。
据此,我可以重现以下行为符合预期:
> (set! str1 (string #\h #\e #\l #\l #\o))
> (set! str2 (string #\h #\e #\l #\l #\o))
> (eq? str1 str2)
#f
Run Code Online (Sandbox Code Playgroud)
但我不明白原因。
是不是,在 Racket 中,只有函数 STRING 返回两个不同的对象,而文字字符串却像符号一样是唯一的?因此,等式?行为通常,但文字字符串的处理方式有所不同?
你能好心给我解释一下吗?
非常感谢。
在过去的几天里,我一直在学习一些 Lisp(主要是Scheme),被这些语言所提供的强大力量所吸引。当然,宏应该是这种力量所基于的最强大的功能。据我所知,学习使用宏很像首先学习如何使用一流的函数。当您学习如何使用一流函数时,它们开始适用于任何地方,以至于很难回到没有这样概念的命令式语言。例如,编写 pre-lambda Java 代码现在对我来说非常痛苦。
考虑到这种一流函数的类比,我非常震惊地发现 Lisp 宏并不是一流的。
例如,我可以通过以下方式轻松地在Scheme中使用一等函数:
(map (lambda (x) (+ x 1)) '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
现在用某个宏的名称替换该 lambda,Scheme 会抱怨您正在使用宏作为变量名。鉴于我无法像数据一样传递宏,它们绝对是二等的。当然,我什至不确定随机宏在这种情况下应该如何工作,但这不是重点。
我总是对仅编译时的构造保持警惕,因为这通常表明语言存在一些限制。因此,我自然想知道宏如何成为一流的运行时对象。我们已经可以用 lambda 来做到这一点了。例如,在此方案代码中, 和 都or将eval-or打印1并返回#t,但eval-or需要在调用站点上使用撇号:
(or
(begin (display "1") (= 5 5))
(begin (display "2") (= 5 6)))
(define eval-or
(lambda (a b)
(if (eval a) #t (eval b))))
(eval-or
'(begin (display "1") (= 5 5))
'(begin (display "2") (= 5 6)))
Run Code Online (Sandbox Code Playgroud)
我不熟悉 的细节eval,但我确实知道它不保留词法范围。但也许如果我们向Scheme 添加某种特殊的构造,例如 …
(define (square x)
(display (* x x)))
(define (sum-of-squares a b)
(+ (square a) (square b)))
Run Code Online (Sandbox Code Playgroud)
我测试了它,sum-of-squares功能不起作用.为什么?
我目前正在尝试将整数转换为列表.
例如
1234 =>列表由1,2,3,4组成
我有这个:
(string->list (number->string 1234))
Run Code Online (Sandbox Code Playgroud)
不幸的是,它添加了#和s.我猜这是一个数字的字符串表示.我该如何删除这些符号.因为我需要重新排序整数,并打印出一个列表.
这是上面命令的输出:
(#\ 1#\ 2#\ 3#\ 4)
scheme ×10
racket ×5
lisp ×4
comparison ×1
equality ×1
equals ×1
file-io ×1
guile ×1
macros ×1
mit-scheme ×1