球拍如何将功能定义为程序中的另一个功能

racket how to define function as another function in procedure

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

辅助函数需要能够做到:

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

最初,内置语法为:

>(sqr num) ; where num=6
36

因为我不能将'num'同时声明为一个函数和一个变量,我需要在其中嵌套另一个过程。以下是我目前所拥有的:

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

现在,我知道 'display' 不会像其他编程语言那样轻易地做我想做的事情。我可以使用另一种方法代替 'display' 吗?我认为这是最简单的方法,但我是新手,所以我不确定哪种方法合适。 'func' 需要能够使用数学函数,例如 'sqr' 'sqrt' 'add1'...等

你的意思是这样的吗?

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

((partial sqr) 6)

输出为36。

如果您只想 (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

对于简单的解决方案,您只需覆盖默认值 reader 并深度反转列表,您将遇到点列表的问题。为了获得正确的结果,您需要编写一个解析器。

运行的代码不会反,只有你写的代码。 some documentation on how to create your own language. Also this practical example 也可能有帮助。