我正在尝试编写一个可以采用简单方程的字符串表示的模块,并对其进行评估.作为第一步,我需要将等式划分为单个令牌; 基于"规则" takePiece.我试着写作cutEqu一个折叠,但遇到了我不是真的折叠在字符串上的问题; 我正在服用不同大小的碎片,直到它耗尽.我可以作弊,让它折叠在一个等于字符串长度的数字列表上,但这看起来很笨拙.
在我读过的大多数指南中,他们注意到一旦你理解了隐式递归模式(比如折叠和贴图),显式递归就很少发生,这似乎是一种潜在的常见情况,但找不到合适的标准函数处理它.有人会如何cutEqu使用隐式递归来编写简单的东西?我确信我可以找出一个简单的函数来封装行为,但是标准库中尚未存在它表明我可能会认为这个场景是错误的.
import Data.Char
isLit :: String -> Bool
isLit = isDigit . head
takePiece :: String -> (String,String)
takePiece str
| isLit str = break (not . isDigit) str
| otherwise = splitAt 1 str
cutEqu :: String -> [String]
cutEqu [] = []
cutEqu xs = let (p,rest) = takePiece xs in
p : cutEqu rest
Run Code Online (Sandbox Code Playgroud)
编辑:这是我试图隐含地写它:
consumeWith :: ([a] -> ([b],[a])) -> [a] -> [[b]]
consumeWith _ [] = …Run Code Online (Sandbox Code Playgroud) 对于作业,我需要form在我的网页中放置一个,并让表单填充一封电子邮件供用户发送。
我在四处搜寻后写下了这个:
<form enctype="text/plain" method="post" action="mailto:[My Email Here]">
<input type="text" name="subject" value="Subject" />
<input type="text" name="body" value="Body" />
<input type="submit" name="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
正如我所期望的,它会打开我的邮件客户端并为我填充一封电子邮件。问题是,它的填充方式非常丑陋且不直观。主题行留空,正文填充:
subject=Subject
body=Body
submit=Submit
(4 lines of white-space)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望“主题”最终出现在主题中,“正文”字段成为唯一出现在正文中的内容,并且“提交”根本不会出现在用户面前。
这可能吗?
此时我只被允许使用 HTML。(仅限 HTML。不允许内联脚本)。
我正在编写一个实体组件系统。我的部分计划是制定一个称为System系统必须满足的协议才能使用 ECS。
问题是,如果我尝试创建一个名为System;的协议,Clojure 会抱怨。似乎是因为它与java.lang.System.
(ns entity.system)
(defprotocol System
; Protocol methods)
Run Code Online (Sandbox Code Playgroud)
产量
CompilerException java.lang.RuntimeException: Expecting var, but System 被映射到类 java.lang.System,编译:(C:\Users\slomi\IdeaProjects\entity\src\entity\system.clj:3:1)
我尝试System通过添加(:refer-clojure :exclude [System])和来排除(:refer-clojure :exclude [java.lang.System]),但都没有做任何事情;我再次收到同样的错误。
当然,我可以给它起别的名字,但System似乎是最合适的名字,而且类似entity.entity-system/Entity-System甚至entity.system/Entity-System似乎过于多余的名字。
如何java.lang.System从命名空间中排除?
我正在编写标准的高/低猜谜游戏,但带有“AI”(尽管这是一个慷慨的术语)。
下面的函数取一个数字范围内的最低和最高数字、先前的猜测和“方向”,该“方向”表示先前的猜测是否太低、太高或正确,并返回新的数字范围猜测。
(defn new-range [min-n max-n guess direction]
(case direction
1 [min-n guess]
-1 [guess max-n]
0 [guess guess]))
Run Code Online (Sandbox Code Playgroud)
当我通过 运行这个函数时lein check,它给了我一个错误/警告:
case has int tests, but tested expression is not primitive.
Run Code Online (Sandbox Code Playgroud)
并指向(case direction。
这是什么意思?我搜索了它,但我能找到的只是对定义此错误的源的引用。
这是我应该担心的吗?我尝试了 type-annotating direction,但这并没有改变任何东西。
编辑:事实证明,当我尝试注释时direction,我不小心使用了 boxed-type Long。哎呀。
对于此代码,我有"TypeError:/ support支持的操作数类型"
class Foo(object):
def __add__(self, other):
return print("add")
def __div__(self, other):
return print("div")
Foo() + Foo()
add
Run Code Online (Sandbox Code Playgroud)
**但对于/**
Foo() / Foo()
Traceback (most recent call last):
File "<ipython-input-104-8efbe0dde481>", line 1, in <module>
Foo() / Foo()
TypeError: unsupported operand type(s) for /: 'Foo' and 'Foo'
Run Code Online (Sandbox Code Playgroud) 我正在编写一个聊天客户端/服务器,并且具有以下带有套接字的代码,并返回一个可以用来更容易地写入套接字的clojure.core.async/channel.
我的问题是,尽管是类型提示,我仍然得到反映警告,呼叫.write无法解决.
(ns chat.main
(:require [clojure.core.async :as a :refer [>! >!! <! <!! go thread chan]])
(:import [java.net Socket ServerSocket]
[java.io InputStream BufferedReader InputStreamReader OutputStream BufferedOutputStream PrintWriter]))
(set! *warn-on-reflection* true)
(defn new-output-chan [^Socket sock]
(let [^OutputStream out (.getOutputStream sock)
^PrintWriter p-out (PrintWriter. out)
out-chan (chan)]
(go
(while (.isConnected sock)
(let [^String message (<! out-chan)]
(.write p-out message) ; <---------- Here
(.flush p-out)))
(a/close! out-chan))
out-chan))
Run Code Online (Sandbox Code Playgroud)
得到:
Reflection warning, C:\Users\slomi\IdeaProjects\chat\src\chat\main.clj:44:5 - call to method write on java.io.PrintWriter can't be …Run Code Online (Sandbox Code Playgroud) 我正在写一个Mandelbrot Set资源管理器.我需要尽可能多的精度,所以我可以尽可能放大.
我注意到混合doubles和BigDecimals 的不幸副作用:它们"污染"了返回的类型:
(type (* 1M 2))
=> java.math.BigDecimal
(type (* 1M 2.0))
=> java.lang.Double
Run Code Online (Sandbox Code Playgroud)
我期待相反.BigDecimals可能更精确,应该污染双打.
除了手动调用bigdec可能与a接触的每个数字之外BigDecimal,还有一种方法可以防止double在doubles和BigDecimals 上进行数学运算时自动降级吗?
我一直的印象是那台是没有顺序的下,但注意到,人物套做似乎下令:
(seq #{\e \c \b \z \a})
=> (\a \b \c \e \z)
Run Code Online (Sandbox Code Playgroud)
如果我介绍其他类型的字符,似乎它们是根据字符的代码进行排序:
(seq #{\e \A \c \space \b \z \a})
=> (\space \A \a \b \c \e \z)
Run Code Online (Sandbox Code Playgroud)
为什么字符根据其代码进行排序,但数字集似乎有任意排序?
我是 clojure 新手,我需要更新此原子内的两个值:
(def app-state (atom {:id "1":status 0 :st 0}))
Run Code Online (Sandbox Code Playgroud)
我使用以下内容:
(let [value (mod (+ (:st @app-state) 1) 4)]
(swap! app-state update-in [:status] value)
(swap! app-state update-in [:st] inc))
Run Code Online (Sandbox Code Playgroud)
我越来越:
Caused by: java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
Run Code Online (Sandbox Code Playgroud) 最近我读了很多关于排序算法的文章,我发现了让我感到困惑的奇怪之处.在函数中,它需要在for循环中创建一个临时数组.示例代码是
for(;;)//ignore the condition
{
int *b = new int[N];
//some code
delete b[];
}
Run Code Online (Sandbox Code Playgroud)
问题是:为什么不在没有new运算符的情况下直接创建它,因为编译器会自动销毁它并在每次迭代后释放内存.就像在循环中写这个
int b[N];
Run Code Online (Sandbox Code Playgroud)
在前面,我总是使用这个方法来创建临时类型/对象.我完全错了或类似数组的内容与内置类型不同?
那么,Stack Overflowers,有人能给我一些建议吗?