如何将函数定义为过程中的另一个函数

时间:2015-03-02 20:43:31

标签: function racket

我正在尝试创建一个辅助函数,它将接受切换语法的输入。

辅助功能需要能够:

> (num sqr) ; where num=6, and sqr is the math function square.
36

最初,内置语法为:

>(sqr num) ; where num=6
36

因为我无法宣布“#”;作为一个函数和一个变量同时,我需要将另一个过程嵌入其中。以下是我到目前为止:

(define (num func)
  (display func + 6))

现在,我知道'显示'与其他编程语言不同,我不会轻易做到我喜欢做的事情。是否有其他方法代替'显示'我可以用吗?我认为这是最简单的方法,但我是新手,所以我不确定哪种方法合适。 ' FUNC'将需要能够采用像' sqr'这样的数学函数。 ' SQRT' ' ADD1' ...等

2 个答案:

答案 0 :(得分:0)

你的意思是这样吗?

#lang racket
(define ((partial func) arg)
  (func arg))

((partial sqr) 6)

输出为36。

答案 1 :(得分:0)

如果您只想让(num sqr)像您的代码一样工作,那么您可以这样做:

(define (num fun)
  (fun 6))

(num sqr) ; ==> 36
(num add1) ; ==> 7

num不会是6。

解决方案可能是让自己成为一种模块语言,可能称为#!lefthanded-racket,其中代码解析器只是反转所有列表。因此,您可以提供如下代码:

#!lefthanded-racket

(6 num define)
(num sqr)  ; ==> 36
(num add1) ; ==> 7

((((((1 y -) x ack) (1 x -) ack) (y x))
                              (2 (1 _))
                        ((y 2 *) (y 0))
                              (0 (0 _)) 
                             (y x) match*)
                           (y x ack) define)
(4 2 ack) ; ==> 65536

对于简单的解决方案,您只需覆盖默认阅读器并深度反转列表,您就会遇到点列表问题。为了做到这一点,你需要编写一个解析器。

运行的代码不会反向,只会写入您编写的代码。有some documentation on how to create your own language。同样this practical example也可能有所帮助。