标签: scheme

麻省理工学院计划的折叠程序有哪些方向?

如果我想在MIT Scheme中反转一个列表,我可以这样做(fold cons '() list),如果列表是(define lis '(1 2 3 4)),则(fold cons '() lis)给出(4 3 2 1).有两种折叠,左右折叠,但如果我使用(fold-right cons '() lis),我会(1 2 3 4)这样,普通折叠不能是那个.此外,如果我使用(fold-left cons '() lis)我得到((((() . 1) . 2) . 3) . 4)这样也不能在原始例子中折叠.反转清单需要什么样的折叠?

我问,因为我希望能够制作一个通用折叠,以便:

(define ls '((1 2 3) (4 5 6)))
(gen-fold cons '() ls)
=> ((6 5 4) (3 2 1))
(define l2 '(((1 2) (2 3)) ((3 4) (4 5))))
(gen-fold …
Run Code Online (Sandbox Code Playgroud)

reduce scheme fold mit-scheme

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

Lisp-family:对符号调用和符号的不同评估作为参数

在lisp-family(EDIT:lisp-1)语言中是否有一种方法可以区分符号评估关于其作为函数或作为参数的位置(即,在评估它时,覆盖此符号的eval)?
作为一个例子(我不需要这个功能,这是一个例子),我想对一组对象实现某种中缀操作,这可以由对象本身调用

(my-obj some-operator arg1 ...)  
Run Code Online (Sandbox Code Playgroud)

这实际上将函数some-operator应用于my-obj和arguments.
但是当这个对象在代码中的任何其他位置用作参数时,例如:

(some-function my-obj &args...) 
Run Code Online (Sandbox Code Playgroud)

它将评估为my-obj的值.
谢谢.

lisp scheme clojure s-expression racket

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

功能编程成语在球拍/哈希尔中计算最多4个没有突变的数字

我计算了4个变量a,b,c和d中字符串中四个字符的出现次数.

现在,我想知道哪个字符出现的次数最多.

我想要一个函数式编程习惯来解决这个问题.

在Haskell中解决它的一种方法如下 -

foldl (\(count1, char1) (count2, char2) -> if count1 > count2 then (count1, char1) else (count2, char2)) (a, "A")  (zip [b, c, d] ["B", "C", "D"])
Run Code Online (Sandbox Code Playgroud)

有人为此问题有其他函数式编程习惯用法吗?

algorithm scheme haskell functional-programming racket

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

递归函数不按计划工作

我在Scheme中编写一个函数,它应该采用两个整数,X和Y,然后递归添加,X/Y + (X-1)/(Y-1) + ...直到其中一个数字达到0.

例如,取4和3:

4/3 + 3/2 + 2/1 = 29/6

这是我的功能无法正常工作:

(define changingFractions (lambda (X Y)
    (cond 
        ( ((> X 0) and (> Y 0)) (+ (/ X Y) (changingFunctions((- X 1) (- Y 1)))))
        ( ((= X 0) or (= Y 0)) 0)
    )
))
Run Code Online (Sandbox Code Playgroud)

编辑:我已经改变了我的代码来解决在评论中列出的问题,以及不断变化的位置orand.

(define changingFractions (lambda (X Y)
    (cond 
        ( (and (> X 0) (> Y 0)) (+ (/ X Y) (changingFunctions (- X 1) (- …
Run Code Online (Sandbox Code Playgroud)

lisp scheme sisc

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

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

将代码从Common Lisp转换为Scheme

我在Common Lisp中创建了一个程序,我也试图让它在Scheme中工作,但它不起作用.我是Scheme和MIT/GNU Scheme的新手.这是Common Lisp中的代码.它在Lispworks中运行良好:

(defun removeAdjc (L) (cond ((null L) L)
      (t (cond ((equal (car L) (cadr L)) (removeAdjc (cdr L))) 
         (t (append (list (car L)) (removeAdjc (cdr L))))))))
Run Code Online (Sandbox Code Playgroud)

这是我用于Scheme的代码:

(define (removeAdjc L)
     (if (null? L) L
        (if (equal? (car L) (cadr L)) (removeAdjc (cdr L))
              (append (list (car L)) (removeAdjc (cdr L)))
           ) ))
Run Code Online (Sandbox Code Playgroud)

这是我在MIT/GNU Scheme上尝试时得到的:

在此输入图像描述

lisp scheme common-lisp mit-scheme

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

如何将一个返回闭包的Scheme函数转换为等效的Common Lisp函数?

我正在将一些Scheme代码转换为Common Lisp.我不知道Scheme.我知道一点Common Lisp.

我想我理解这个Scheme代码:

(define (make-cell)
    (let ((local-name '()))
       (define (local-add-name name)
           (set! local-name name))
        (define (me message)
            (cond ((eq? message 'add-name) local-add-name)
                  ((eq? message 'name) local-name)))
     me))
Run Code Online (Sandbox Code Playgroud)

使用该功能,我可以制作两个单元格:

(define a (make-cell))
(define b (make-cell))
Run Code Online (Sandbox Code Playgroud)

然后我可以在每个单元格中存储一个名称:

((a 'add-name) 'a)
((b 'add-name) 'b)
Run Code Online (Sandbox Code Playgroud)

然后我可以检索存储在每个单元格中的名称:

(a 'name)
Run Code Online (Sandbox Code Playgroud)

=> a

(b 'name)
Run Code Online (Sandbox Code Playgroud)

=> b

a-cell在其中存储了名称"a".b-cell在其中存储了名称"b".我可以查询a-cell的名称,然后返回"a".我可以查询b-cell的名称,然后返回"b".

到目前为止,我是否正确理解?

现在我想使用Common Lisp实现相同的功能.这是我创建的make-cell函数:

(defun make-cell ()
    (let ((local-name nil))
        (defun local-add-name (name)
            (setf local-name name))
        (defun me (message)
            (cond ((eq message 'add-name) #'local-add-name)
                  ((eq message 'name) local-name)))))
Run Code Online (Sandbox Code Playgroud)

显然这是错误的,因为它没有给出所需的行为,正如我接下来所示. …

scheme common-lisp

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

为什么在Scheme里面重新分配函数呢?

这是从代码简单计划(代码在这里),该学生是应该加载和使用,因为我们与练习跟着一起.(注意:我是个人,只为自己这样做.)

(define first
  (let ((pair? pair?)
    (char->word char->word)
    (string-ref string-ref)`
    (word->string word->string)
    (car car)
    (empty? empty?)
    (whoops whoops)
    (word? word?))
    (define (word-first wd)
      (char->word (string-ref (word->string wd) 0)))
    (lambda (x)
      (cond ((pair? x) (car x))
        ((empty? x) (whoops "Invalid argument to FIRST: " x))
        ((word? x) (word-first x))
        (else (whoops "Invalid argument to FIRST: " x))))))
Run Code Online (Sandbox Code Playgroud)

我不够好,一起了解的一般使用letlambda在此功能,但我不明白的是为什么在let表单中每个支持功能(一些自制的,一些电池,包括计划)被重复,例如,(pair? pair?)(car car).为什么这些在这里被准重新分配let

scheme

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

在球拍中使用lambda进行迭代?

这可能是一个简单的问题,但我似乎无法弄明白.在下面的示例中,我想创建一个list-of-obj递归创建项列表的函数.

例:

> (list-of-obj 'a 5)
'(a a a a a)
Run Code Online (Sandbox Code Playgroud)

代码:

#lang racket
(define (list-of-obj obj n)
  (letrec ((helper
           (lambda (obj n result)
             (if (> n 0)
               (helper obj (- n 1) (cons obj result))
               result))))
      helper obj n 0))
Run Code Online (Sandbox Code Playgroud)

然而,这导致输出0.有什么指针吗?我是球拍/计划的新手.

lisp lambda scheme racket

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

[S:N]的宏在Racket的范围内

如何创建宏以使S:N或[S:N]返回以S开头并以N结尾的数字范围(步骤1).基本上,它应该能够用它来代替"范围内".我尝试创建类似于Curly bracket {}的东西来替换Racket中的'begin'但不能.

编辑:我尝试按照@soegaard的建议:

我-top.rkt:

#lang racket
(define-syntax-rule (my-top S:N)
    (range S N) )

(provide (rename-out [my-top #%top]))
Run Code Online (Sandbox Code Playgroud)

test.rkt:

#lang racket
 (require "my-top.rkt")

 (1:42)
Run Code Online (Sandbox Code Playgroud)

但它没有运行.错误是:

 #%top: use does not match pattern: (#%top S:N) in: (#%top . 1:42)
Run Code Online (Sandbox Code Playgroud)

[1:42]和1:42也行不通.

scheme racket

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