我最近一直在阅读很多关于函数式编程的东西,我可以理解它的大部分内容,但是我无法解决的一件事就是无状态编码.在我看来,通过删除可变状态简化编程就像通过删除仪表板来"简化"汽车:成品可能更简单,但运气好,使其与最终用户交互.
几乎我能想到的每个用户应用程序都将状态作为核心概念.如果您编写文档(或SO帖子),状态将随每个新输入而变化.或者,如果你玩视频游戏,有很多状态变量,从所有角色的位置开始,他们往往不断移动.如果不跟踪变化的价值,你怎么能做有用的事情呢?
每当我找到讨论这个问题的东西时,它都是用真正技术性的函数来编写的,它假设我没有大量的FP背景.有没有人知道一种方法可以向那些对命令式编码有良好,扎实理解的人解释这一点,但是谁在功能方面是完整的n00b?
编辑:到目前为止,一堆回复似乎试图让我相信不可变值的优点.我得到那个部分.这很有道理.我不明白的是,如何在没有可变变量的情况下跟踪必须改变和不断变化的值.
有很多程序可以创建一个差异补丁,但我有一点时间试图应用一个.我正在尝试分发补丁,我从用户那里得到了一个关于如何应用补丁的问题.所以我试着自己搞清楚,发现我没有线索,我能找到的大多数工具都是命令行.(我可以处理一个命令行,但是很多人在没有友好的GUI的情况下会丢失.所以这些都不利于此目的.)
我尝试过使用TortoiseSVN.我有我想申请的补丁.我右键单击补丁,TortoiseSVN子菜单下有一个选项,上面写着"Apply patch".它只是拉出一个空窗口.
所以我试着点击Open.它有两个选项:合并和应用统一差异.(幸运的是,补丁采用统一的差异格式.)但是普通的apply选项不起作用:它要求补丁和文件夹.不知怎的,它忘了要求文件应用补丁!所以TortoiseSVN只是简单的不起作用.是否有基于Windows GUI的实用程序,它将获取补丁和文件并正确应用它?
编辑:看看到目前为止的回复,似乎Tortoise只会在它已经版本化的文件中正确执行.情况并非如此.我需要能够将补丁应用于不是来自SVN存储库的文件.我只是尝试使用Tortoise,因为我碰巧知道SVN使用差异并且必须知道如何创建它们并应用它们.
我在 Ubuntu 中有一个 Gradle 项目。它是用 Java 14 编写的。我安装了 Java 14 JDK。当我从命令行构建它时,一切正常,但没有人想使用命令行!当我在 IntelliJ Idea 中打开它时,它会抛出一个错误:
* Where:
Initialization script '/tmp/ijmapper.gradle`
* What went wrong:
Could not compile initialization script '/tmp/ijmapper.gradle`.
> Startup failed:
General error during semantic analysis: Unsupported class file major version 60.
Run Code Online (Sandbox Code Playgroud)
紧随其后的是一段长而无用的堆栈跟踪,其中说了很多关于 Groovy 的信息。(该项目不是 Groovy 项目;它是一个 Java 项目。)
主要版本 60 指的是 Java 16,该项目未使用该版本。我已经进入项目结构并确保它设置为使用 JDK 版本 14。但名称“ijmapper”表明这与 IntelliJ 有关系,这可能是 IDE 问题而不是项目问题。
映射器文件只是说:
if(!ext.has('mapPath')) ext.mapPath = { path -> path}
换句话说,一个简单的 polyfill。
有谁知道这里发生了什么以及如何解决它?我已经浪费了一天的时间来尝试让它发挥作用,我快到这里了!
我知道有一个用于创建Delphi扩展的API.我经常使用GExperts软件包和各种JVCL专家.但我从未见过调试器的任何扩展.例如,能够为各种对象注册查看器而不必在Inspector中检查它们将是非常好的.(A形式与显示的TImage,例如图像控制,或一个显示的数据集的内容的网格.)
是否有任何API允许您以这种方式扩展Delphi的调试器?
编辑:当我写这个问题时,这不可用,但Delphi 2010提供了一种方法.
显然,64位处理器具有64位地址空间,因此您可以使用超过4 GB的RAM.编译与64位相同的程序并在64位CPU上运行是否有任何其他优点可能实际上有益于不是巨大内存占用的程序?
我一般都在询问CPU,尤其是与Intel兼容的CPU.
我有一个带有大型TImage的表单作为背景.问题是,它作为位图直接存储在DFM中,占用大约3 MB.原始的PNG文件大约是250K.我想尝试通过在资源中嵌入PNG来减少膨胀,然后在OnCreate期间使用表单加载它.我现在可以这样做,因为Delphi 2009包含PNG支持,除了我不太清楚如何使用PNG构建资源文件.有谁知道这是怎么做的?
堆是树数据结构,其中树的较高级别总是包含比较低级别更大(或更小,如果它设置的那样)值."堆"是一堆程序可用于动态分配的空闲RAM.它们都被称为"堆",但是那个与另一个有什么关系呢?
他们说压缩垃圾收集器比传统的内存管理更快,因为它们只需要收集活动对象,并通过在内存中重新排列它们,所以一切都在一个连续的块中,最终没有堆碎片.但是如何快速完成呢?在我看来,这相当于bin-packing问题,它是NP难的,并且在我们关于计算的当前限制内的大数据集上无法在合理的时间内完成.我错过了什么?
我试图在GLSL中围绕着色器,我已经找到了一些有用的资源和教程,但是我一直在为一些应该是根本和微不足道的东西碰壁:我的片段着色器如何检索颜色目前的片段?
你可以通过说明来设置最终颜色gl_FragColor = whatever,但显然这是一个仅输出值.如何获得输入的原始颜色,以便对其进行计算?这必须在某个地方变量,但如果有人知道它的名字,他们似乎没有在我到目前为止遇到的任何教程或文档中记录它,它正在推动我的问题.
我在编写测试代码时注意到的一点是,长时间运行的操作在程序运行第一次运行时比在后续运行时运行的时间要长得多,有时甚至会超过10倍.显然这里有一些冷缓存/暖缓存问题,但我似乎无法弄清楚它是什么.
它不是CPU缓存,因为这些长时间运行的操作往往是我提供大量数据的循环,并且它们应该在第一次迭代后完全加载.(另外,卸载和重新加载程序应该清除缓存.)
此外,它不是光盘缓存.我已经通过预先从光盘加载所有数据并在之后处理它来排除这种情况,而实际的CPU绑定数据处理正在缓慢进行.
那么什么可能导致我的程序在第一次运行时运行缓慢,但是如果我关闭它并再次运行它,它运行得更快?我已经在几个不同的程序中看到了这些,这些程序做了很多不同的事情,所以它似乎是一个普遍的问题.
编辑:为了澄清,我在Delphi写作,虽然我不认为这是特定于Delphi的问题.但这意味着无论问题是什么,它都与JIT问题,垃圾收集问题或托管代码带来的任何其他包袱无关.我不是在处理网络连接.这是纯CPU绑定处理.
一个例子:脚本编译器.它运行如下:
如果我将光盘中的所有内容从光盘加载到内存后将一个巨大的脚本文件(~100k行)提供给它,则lex步骤在我第一次运行时大约需要15秒,在后续运行时大约需要2秒.(是的,我知道这还有很长一段时间.我正在努力......)我想知道这种减速的来源以及我能做些什么.