标签: scheme

如何将字符串转换为方案中的整数列表?

如何将数字字符串转换为整数列表?我希望将“1234”转换为列表 1 2 3 4

scheme racket

2
推荐指数
1
解决办法
1251
查看次数

如何读取 MIT/GNU 方案中的文本文件?

我一直在学习 SICP,我想应用我迄今为止学到的一些概念。也就是说,积累、映射和过滤将帮助我提高工作效率。我主要使用 CSV 文件,并且我知道 MIT/GNU 方案不支持这种文件格式。但这没关系,因为我可以将 CSV 文件导出到 txt 文件,因为支持 txt 文件。

现在我阅读了手册的第 14 节输入/输出,坦率地说,缺乏具体的示例并不能帮助我入门。因此,我希望你们中的一些人能给我一个良好的开端。我有一个文本文件 foo.txt,其中包含国家列表的变量和观察结果。我只想将这个文件读入Scheme并操作数据。感谢您的帮助。任何示例代码都会有所帮助。

file-io scheme mit-scheme

2
推荐指数
1
解决办法
1195
查看次数

计划在 guile 中获取最后一个命令

通常在终端(或我以前使用过的任何其他命令提示符)中,我会按向上键来获取最后输入的命令。然而,当在guile解释器中这样做时,我只是得到:

scheme@(guile-user) [1]> ^[[A
Run Code Online (Sandbox Code Playgroud)

获取 guile 中最后输入的命令的最简单方法是什么?

lisp scheme guile

2
推荐指数
1
解决办法
624
查看次数

LISP 中以索引作为参数之一的映射函数

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)

显然,这不是一个非常有效的实现,并且不支持多个列表作为参数,就像常规映射一样。

lisp scheme racket

2
推荐指数
1
解决办法
926
查看次数

是否可以根据要比较的数据生成相等函数?

如果两个布尔值相同,则两个布尔值相等,两个数字相似。如果两个集合具有相同的元素,则它们相等。如果检查两组是否相等,我们可以使用以下方案/球拍函数:

\n\n
(define (same-set? l1 l2)\n  (and (subset? l1 l2) (subset? l2 l1)))\n
Run 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)。 …

scheme code-generation equality equals racket

2
推荐指数
1
解决办法
250
查看次数

如何获取函数名称作为符号?

我正在尝试定义一个函数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 对此表达能力不够?

scheme racket

2
推荐指数
1
解决办法
865
查看次数

情商吗?在 Racket 中的行为与 eq 不同?在 Guile 中还是 Common Lisp 中的 eq?

新年快乐!

我正在努力进入 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 comparison scheme racket

2
推荐指数
1
解决办法
211
查看次数

Lisp 宏对于可选择评估其参数的函数有什么作用?

语境

在过去的几天里,我一直在学习一些 Lisp(主要是Scheme),被这些语言所提供的强大力量所吸引。当然,宏应该是这种力量所基于的最强大的功能。据我所知,学习使用宏很像首先学习如何使用一流的函数。当您学习如何使用一流函数时,它们开始适用于任何地方,以至于很难回到没有这样概念的命令式语言。例如,编写 pre-lambda Java 代码现在对我来说非常痛苦。

考虑到这种一流函数的类比,我非常震惊地发现 Lisp 宏并不是一流的。

例如,我可以通过以下方式轻松地在Scheme中使用一等函数:

(map (lambda (x) (+ x 1)) '(1 2 3))
Run Code Online (Sandbox Code Playgroud)

现在用某个宏的名称替换该 lambda,Scheme 会抱怨您正在使用宏作为变量名。鉴于我无法像数据一样传递宏,它们绝对是二等的。当然,我什至不确定随机宏在这种情况下应该如何工作,但这不是重点。

选择?

我总是对仅编译时的构造保持警惕,因为这通常表明语言存在一些限制。因此,我自然想知道宏如何成为一流的运行时对象。我们已经可以用 lambda 来做到这一点了。例如,在此方案代码中, 和 都oreval-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 添加某种特殊的构造,例如 …

lisp macros scheme

2
推荐指数
1
解决办法
188
查看次数

为什么这个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功能不起作用.为什么?

scheme

1
推荐指数
1
解决办法
619
查看次数

将整数转换为List?

我目前正在尝试将整数转换为列表.

例如

1234 =>列表由1,2,3,4组成

我有这个:

(string->list (number->string 1234))
Run Code Online (Sandbox Code Playgroud)

不幸的是,它添加了#和s.我猜这是一个数字的字符串表示.我该如何删除这些符号.因为我需要重新排序整数,并打印出一个列表.

这是上面命令的输出:

(#\ 1#\ 2#\ 3#\ 4)

scheme

1
推荐指数
1
解决办法
4297
查看次数