如何创建一个 lambda 程序?

如何解决如何创建一个 lambda 程序?

我需要使用 Scheme 完成大学课程的作业。我以前从未在 Scheme 中编码过,所以我不知道我在做什么。我们的任务是定义一个匿名函数来计算二次函数的判别式。我不断遇到错误:“无效的‘定义’。任何帮助将不胜感激。

(define roots (lambda(abc))(
  (lambda(discriminant))(
    list(/(+(-b) discriminant)(*2a))
        (/(-(-b) discriminant)(*2a))
  )
        (sqrt - (*bb)(*4ac))
  )

解决方法

首先,你应该了解一下 Scheme 代码是什么样的;找到一些示例代码(在您的教科书中,或在线,或在 SO 上的答案中)并注意括号和空格的使用方式。然后效仿。您不能在 Scheme(或任何 Lisp)中任意放置括号或任意删除空格。

例如,在发布的代码中 (-b) 有两处错误。首先,-b 被视为一个符号,而不是 b 值的否定。此外,将符号放在括号中表示过程调用;给定一个 s 表达式 (f x)f 要么是句法关键字(在这种情况下 (f x) 被解释为宏调用),或者 (f x) 被解释为过程调用.如果是过程调用并且 f 未绑定到过程,则会引发异常。因此,(-b) 尝试调用一个名为 -b 的过程,该过程不存在(除非您已定义它),从而引发异常。您可以使用 (- b),在 - 过程和符号 b 之间有一个空格;这评估为 b 值的否定。

同样,*2a 被解释为一个符号,而不是一个表达式;将 *2a 放在括号之间被解释为过程调用。解释器(或编译器)期望 *2a 是一个不带参数的过程。您需要添加空格:(* 2 a);这被解释为使用参数 *2 调用过程 a

(*bb)(*4ac) 有完全相同的问题。第二种情况很有趣,因为当它正确编写时,它说明了前缀表示法的优点之一。由于 * 是关联的,因此多个值相乘的顺序无关紧要。要在前缀符号中天真地表达 4 * a * c,您可以编写 (* 4 (* a c)),显式地对乘法进行排序。您也可以将其写为 (* (* 4 a) c),以不同的顺序相乘。乘以什么顺序无关紧要,因此您不妨直接写成 (* 4 a c),只要您的语言支持这种表示法即可。事实证明,Scheme 和其他 Lisp 确实支持这种表示法。

已发布代码中 s 表达式符号的另一个问题(在解决上述问题后):(sqrt - (* b b) (* 4 a c))。这试图在参数 sqrt-(* b b) 上调用 (* 4 a c) 过程。但是 sqrt 不是一个高阶过程(即它不接受过程作为参数),它实际上只接受一个参数。它旨在将 - 过程应用于参数 (* b b)(* 4 a c),在取平方根之前减去它们:(sqrt (- (* b b) (* 4 a c)))

第一个 lambda 表达式有一个形参列表,只包含一个参数:abc。和以前一样,这是一个错误。目的是定义三个参数:不要吝啬空格:(lambda (a b c))

另一个重要问题是 lambda 表达式中存在语法错误:(lambda (a b c)) 没有正文,但 lambda 表达式必须至少有身体里的一种表情。这可能是为了包装后面的 lambda 表达式。类似地,内部 lambda 表达式缺少其主体。它可能是为了包装后面的 (list ;;...) 形式。

完成后,内部 lambda 表达式本身位于一对括号内,将表达式 (sqrt (- (* b b) (* 4 a c))) 作为其参数。这是 lambda 绑定的 let 形式。因此,内部 lambda 接受一个参数 discriminant,并评估作为其主体的 list 形式。由于内部 lambda 表达式本身出现在 s 表达式的第一个位置,因此它是过程调用的一部分,然后根据其参数调用此内部匿名过程,将 discriminant 绑定到值通过评估该参数获得,即 (sqrt (- (* b b) (* 4 a c)))。这一切都发生在外部 lambda 内部,它采用三个参数 abc。因此,root 是一个函数,它带有三个参数,并在将判别计算的结果绑定到 discriminant 之后返回一个根列表(作为一种既简化根的表达式又确保判别式只需要计算一次)

这是修复代码。请注意,我只添加了一些空格并添加或移动了一些括号;没有其他任何改变:

(define roots
  (lambda (a b c)
    ((lambda (discriminant)
       (list (/ (+ (- b) discriminant) (* 2 a))
             (/ (- (- b) discriminant) (* 2 a))))
     (sqrt (- (* b b) (* 4 a c))))))

注意这看起来像什么。在 Lisps 中,您几乎不应该将括号单独放在一行上,并且您应该始终在参数之间放置一个空格。请记住,一切都是过程调用。

这是一个示例交互。请注意,您可以将负数表示为 -1 而不是 (- 1)(如果您愿意,您可以使用任何一种)。您只是无法使用变量表示负值作为 -b

> (roots 1 0 -1)
(1 -1)
> (roots 1 8 15)
(-3 -5)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res