标签: scheme

将函数作为参数传递但获得意外结果

我正在使用具有"高级学生"语言设置的Racket,并且我很难尝试编写一个函数来执行函数,执行n次并报告每次运行所用的时间.这是我到目前为止所得到的.

(define (many n fn)
  (cond
    [(= n 0) true]
    [else (many (sub1 n) (local ((define k (time fn))) k))]))
Run Code Online (Sandbox Code Playgroud)

我有一个函数叫做fact计算数字的阶乘.

(define (fact n)
  (cond
    [(= 0 n) 1]
    [else (* n (fact (- n 1)))]))
Run Code Online (Sandbox Code Playgroud)

如果我评估(time (fact 10000)),我得到合理的结果cpu,real和gc时间,以及大量.一切都很好.

但是,当我尝试评估时,(many 3 (fact 10000))我得到:

cpu time: 0 real time: 0 gc time: 0
cpu time: 0 real time: 0 gc time: 0
cpu time: 0 real time: 0 gc time: 0
true
Run Code Online (Sandbox Code Playgroud)

fact尽管作为参数传递,为什么函数不进行评估?

lambda scheme functional-programming operator-precedence racket

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

当给定的参数是两个项目和一个列表时,如何在DrScheme的列表中替换另一个项目?

当给定的参数是两个项目和一个列表时,如何在DrScheme的列表中替换另一个项目?

scheme racket

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

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

方案 - 功能"如果"

在下一个代码中

(if (exp1)
    (Do1)
    (Do2))
Run Code Online (Sandbox Code Playgroud)

当exp1为真时,(Do1)正在发生.我的问题是,如果条件为真,我想做件事.意思是 - 我想添加一个列表链接,并再次调用该函数.

so Do1 in my program is:
           ((cons (car hello) list1)
            (Myfunction (cdr data) list1))
Run Code Online (Sandbox Code Playgroud)

它给了我下一个问题:

procedure application: expected procedure, given: ((439043 Mylist)); arguments were: ()
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

谢谢.

scheme

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

在Scheme中查找列表中的元素

我是Scheme的初学者,并试图弄清楚它是如何运作的; 所以我想写一个基本代码:首先我有一个定义集: zipcode(ZIPCODE CITY STATE)

(define zipcodes '(
 (96774 ookala hawaii)
 (90001 losangeles california)
 (90263 malibu california)
 (10044 newyork newyork)
 ))
Run Code Online (Sandbox Code Playgroud)

我尝试编写一个输入为zipcode的函数,并返回城市和州名称,例如:

 >(find '10044)
 (list 'newyork 'newyork)

 >(find '99999)
 empty because there is not zipcode like that.
Run Code Online (Sandbox Code Playgroud)

非常感谢...

我不允许我们LET功能

scheme list matching

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

drscheme - 有限状态机

感谢在这个伟大的网站上的人们,我设法将几乎完整和有效的代码放在一起.我有一个最后的问题.

这是代码:

     (define (chartest ch)
       (lambda (x) (char=? x ch)))

     (define fsm-trans
        '((A (lambda (x) (string=? x "a") B), (B (lambda (x) (string=? x "a") C)))))

     (define (find-next-state state ch trl)
       (cond
         [(empty? trl) false] 
         [(and (symbol=? state (first (first trl)))
              ((second (first trl)) ch))
          (third (first trl))]
         [else (find-next-state state ch (rest trl))]))


     (define fsm-final '(C))

     (define start-state 'A)

     (define (run-fsm start trl final input)
       (cond
         [(empty? input)
          (cond
            [(member start final) true]
            [else false])]
         [else 
          (local ((define next …
Run Code Online (Sandbox Code Playgroud)

scheme fsm racket

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

如何编写一个维护本地状态的宏?

这似乎有效,它是一个宏,可以根据扩展的次数扩展到连续的整数.

;; Library (test macro-state)
(library
 (test macro-state)
 (export get-count incr-count)
 (import (rnrs))

 (define *count* 0)
 (define (get-count) *count*)
 (define (incr-count) (set! *count* (+ *count* 1)))

 )

;; Program
(import (rnrs) (for (test macro-state) expand))

(define-syntax m
  (lambda (x)
    (syntax-case x ()
      ((m) (begin (incr-count) (datum->syntax #'m (get-count)))))))

(write (list (m) (m) (m)))
(newline)
;; prints (1 2 3)
Run Code Online (Sandbox Code Playgroud)

但它对我来说很笨拙,因为宏状态*count*和宏m本身在不同的模块中.有没有更好的方法在r6rs中执行此操作,最好是不将两个模块的实现分开?

编辑

我应该说清楚,尽管这个例子只是一个宏,但实际上我正在寻找一种在多个宏需要共享状态时有效的方法.

scheme r6rs

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

SICP练习1.2

我在SICP练习1.2时遇到了困难.

将以下内容翻译为前缀形式:

5 + 4 + (2 - (3 - (6 + 4/5))) / 3(6 - 2)(2 - 7)

这就是我所拥有的,我无法弄清楚它为什么不起作用.我错过了什么?

(/
 (+
  (+ 4 5)
  (- 2
     (- 3
        (+ 6
           (/ 4 5)))))
 (* 3
    (*
     (-6 2)
     (- 2 7))))
Run Code Online (Sandbox Code Playgroud)

scheme sicp

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

帮我把这个Java翻译成Scheme来让事情顺利进行

我正在学习Scheme,我已经阅读了基础知识,但我仍然无法想象如何将Java类"映射"到Scheme代码.你们中的任何人能帮助我吗?我只需要有人向我展示这在Scheme中如何看待最终细节并让我的想法得到解决:

public class sumFibonacciValues {
    public static void main(String [] args) {
        int n = 4000000;
        long i2 = 1, i1 = 1, Fibo = 0, temp = 1;
        while(i2 < n) {
            temp = i1 + i2;
            i1 = i2;
            i2 = temp;
            if(i2 % 2 == 0)
                Fibo += i2;
        }
        System.out.println(Fibo);
    }
}
Run Code Online (Sandbox Code Playgroud)

java scheme code-translation

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

正则表达式为计划类型的输入

我正在编写一个java程序,它将根据计划类型的输入进行操作

语言

就像是

(+ (+ a b))
Run Code Online (Sandbox Code Playgroud)

假设我现在想检查语法,如果有2个括号已打开,则必须有2个其他结束括号.我不知道如何使用正则表达式来实现这一点.你能帮我吗

java regex scheme

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