热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Clojure,试图调用未绑定的fn

如何解决《Clojure,试图调用未绑定的fn》经验,为你挑选了1个好方法。

我尝试使用递归在Clojure中创建阶乘函数

(defn fac[x] (if (= x 1) 1 (* x (fac (- x 1)))))

现在,当我尝试调用该函数时

(fac 5)

我得到了例外

java.lang.IllegalStateException: Attempting to call unbound fn: #'sandbox11355/fac

这是否意味着在使用defn关键字定义函数时不可能使用递归?

另外,我如何最有效地接受这种功能语法,因为我已经习惯了命令式/ OOP思维方式?以相反的顺序键入所有内容感觉很尴尬.通过程序范式,思想的连续体直接映射到改变价值的新代码行.使用函数语法,对于操作当前值的每个步骤,我必须围绕表达式包装新函数,并且很难跟踪parens和范围.我是否应该学会以相反的顺序思考程序模型以流利地编写功能样式?

我理解没有可变状态和纯函数(更少的错误)的好处,但很难相信它失去编写过程代码的便利性.就目前而言,所有这些似乎都过度炒作无组织的混乱,但也许它开始有意义.



1> Josh..:

关于您对功能和程序编程的关注的一些信息如下.它不是特别原创,但它可能会让你开始思考如何考虑这些新东西.

函数式编程不是反过来的过程式编程.它是一个更高级别的抽象,我们与之交互的大多数东西都可以看作是一种抽象; 否则,我们永远不会得到任何有用的东西,因为我们会如此关注我们处理的每件小事的细节.同样,任何语言的所有代码最终都成为CPU的一系列指令,这些指令是"命令"或"程序"的缩影.问题变成了,"为了解决我的问题,我需要对极低的细节进行多少控制?"

将一些数字加在一起的一种方法,非常明确(只是伪代码,希望意图很清楚):

int nums[10] = {0,1,2,3,4,5,6,7,8,9};
int i = 0;
int acc = 0;

start_loop:
  if (i >= 10) goto done_loop;

  int num_address = (nums + i);
  int num_value = *num_address;
  acc = acc + num_value;
  i = i + 1;
  goto start_loop;

done_loop:
  return acc;

这很乏味,但不像汇编代码那样乏味.为了抽象出循环的一些细节,C/java/etc提供了一个称为for循环的控制结构:

int nums[10] = {0,1,2,3,4,5,6,7,8,9};
int acc = 0;

for (int i = 0; i <10; i++)
  acc += nums[i];

return acc;

当然,当您定期编写命令式代码时,这似乎是完全正常的.您可以迭代地思考,以及如何在每个偏移量的基础上访问数组的细节.然而,这也可以被认为是乏味的.我为什么要关心如何访问数组的每个成员的细节?调用任何函数式语言提供的进一步抽象reduce.可以将其视为以与forC/java/etc程序员相似的方式提供的工具.它看起来很奇怪,就像for汇编程序员第一次看到它的语法一样:

(reduce + (range 10))

所以我们在这里所做的只是抽象出循环的细节,以至于我们真的不太关注实际发生的循环.我们还抽象出了创建一个明确的数字范围的细节,并且只是说"给我从0(包括)到10(不包括)的整数".它只是抽象出细节.结果通常是能够更多地关注手头的问题.

为了增加数字或思考更高级别,一种功能性的编程方式通常允许我们以更少的代码提高工作效率,同时让各级编译器为我们处理混乱的细节.但是,如果问题的水平很低,那么我们可能希望语言中的结构更适合我们的问题.关键是始终使用正确的工具来完成正确的工作.

当然,它不是一个完美的世界,而且经常在clojure中我们被迫编写处理位和字节的低级细节,同步并发代码,循环等等.但是总体来说,是声明,并说明是什么你想做的事,而不是更加明确如何做到这一点,有很多好处.

做4clojure问题,给它一两个月开始真正有意义,并允许你的思想从变异变量转变为评估表达式.您很有可能会非常享受它,而最糟糕的情况是您可以开阔视野.祝好运并玩得开心点!


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了[从头学数学]中第101节关于比例的相关问题的研究和修炼过程。主要内容包括[机器小伟]和[工程师阿伟]一起研究比例的相关问题,并给出了一个求比例的函数scale的实现。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
fengzi199171
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有