引用自算法教科书:
“当 for 或 while 循环以通常的方式退出时(即,由于循环头中的测试),测试比循环体多执行一次。”
因此,例如,以 开头的 for 循环for j=1 to 3将不会执行 3 次,而是执行 4 次!
问题:为什么这样的循环会执行 4 次而不是 3 次?
以我的推理:
When j = 1, the loop is executed.
When j = 2, the loop is executed.
When j = 3, the loop is executed.
When j = 4, the loop is NOT executed.
Run Code Online (Sandbox Code Playgroud)
我数 3,而不是 4。
(eduction ..)在REPL中调用返回看起来像序列的东西(即" (1 2 3)"之类的东西).但是如果你检查这个返回值是否是一个序列(通过seq?),你得到false.
问题: Eduction究竟是什么?它只是一个值列表,将逐个送入减少函数吗?
假设我可以通过某个库访问纯的react.js组件:
var MyPureJavaScriptComponent = React.createClass({
render: function() {
//...
}
});
Run Code Online (Sandbox Code Playgroud)
但我希望使用om.next,其中React组件是通过defui宏构建的:
(defui MyComponent
Object
(render [this]
(div nil "Hello, world!")))
Run Code Online (Sandbox Code Playgroud)
问题:MyPureJavaScriptComponent进入的最佳方式是什么om.next?如果它可以被包装在它自己的调用中,那将是非常好的(至少在美学上),defui因此它MyPureJavaScriptComponent与其他所有om.next组件处于同一个基础上.这是否可能(并且它是最好的方式)?
我正在 ClojureScript 中工作,希望以文本文件的形式序列化大量 EDN 数据结构(特别是:大地图)(与 JS 对象存储为.json文件的方式相同)。性能问题不是问题。
这是否可能,如果可以,是否有考虑标准/最佳实践方法来做到这一点?
我正在使用C代码库
typedef void(* wl_notify_func_t) (struct wl_listener *listener, void *data)
//...
struct wl_listener {
struct wl_list link;
wl_notify_func_t notify; //<-- I'd like to return this
};
Run Code Online (Sandbox Code Playgroud)
并使用了Haskell代码
type NotifyFuncT = FunPtr (Ptr C'WlListener -> Ptr () -> IO ())
initializeMyCtx = C.context $ C.baseCtx <> C.funCtx <> mempty {
C.ctxTypesTable = Data.Map.fromList [
(C.Struct "wl_listener", [t|C'WlListener|])
-- ...
, (C.TypeName "wl_notify_func_t", [t|NotifyFuncT|])
]
}
someHaskellFunction :: Ptr C'WlListener -> IO NotifyFuncT
someHaskellFunction ptrToWlListener = do
funPtr <- [C.block| wl_notify_func_t {return $(struct …Run Code Online (Sandbox Code Playgroud) 如何制作一个Haskell函数,该函数每次在程序过程中被调用时都会生成一个唯一值?
一种想法是:
incrementInteger :: IO (Integer)
incrementInteger = -- ...
Run Code Online (Sandbox Code Playgroud)
这样,每次在程序执行过程中调用它就递增(无论从哪个线程调用,等等)。
incrementIngeter
=> 0
incrementInteger
=> 1
incrementInteger
=> 2
Run Code Online (Sandbox Code Playgroud)
也就是说,我对此函数唯一关心的属性是“无论如何,每次调用时该值都是唯一的”。这该怎么做?
编辑:看起来Data.UUID通过提供此功能generatedNamed。
假设通道chan在队列中具有值"1"和"2".
目标:创建一个获取chan并返回向量的函数[1 2].请注意,如果此函数在返回其值之前必须阻塞一段时间,我完全没问题.
尝试:
(defn chan->vector
[chan]
(let [a (atom true) v []]
(while (not-nil? @a)
(go
(reset! a (<! chan))
(into v @a)
(reset! a (<! chan))
)
) v
)
)
Run Code Online (Sandbox Code Playgroud)
结果:我的REPL冻结并最终吐出一个巨大的错误.我已经意识到这是因为(go ...)块是异步的,所以立即返回.因此,我的(while ...)循环中的原子永远不会被设置为nil,并且循环永远不会终止.
那么我该如何实现预期的结果呢?如果它是相关的,我正在使用ClojureScript和目标nodejs.
在 a 中project.clj,当您看到以下内容时:
:dependencies [[org.clojure/clojure "1.8.0"]
[org.clojure/clojurescript "1.7.228"]
[com.cemerick/piggieback "0.2.1"]
[org.clojure/tools.nrepl "0.2.10"]
[org.clojure/core.async "0.2.374"]]
Run Code Online (Sandbox Code Playgroud)
和:
:plugins [[org.bodil/lein-noderepl "0.1.11"]
[lein-cljsbuild "1.1.2"]
[lein-npm "0.6.1"]
[lein-repls "1.9.5"]
[lein-doo "0.1.6"]]
Run Code Online (Sandbox Code Playgroud)
考虑以下Haskell语句:
mapM print ["1", "2", "3"]
Run Code Online (Sandbox Code Playgroud)
实际上,这按顺序打印"1","2"和"3".
问:你怎么知道那mapM会先打印出"1",然后打印出"2",并最终打印出"3".有没有保证会这样做?或者它是如何在GHC深度实施的巧合?
请看下面的代码片段锈从锈病编程语言,第二版:
pub struct Guess {
value: u32,
}
impl Guess {
pub fn new(value: u32) -> Guess {
if value < 1 || value > 100 {
panic!("Guess value must be between 1 and 100, got {}.", value);
}
Guess {
value
}
}
pub fn value(&self) -> u32 {
self.value
}
}
Run Code Online (Sandbox Code Playgroud)
和相应教程的评论,强调我的:
接下来,我们实现一个名为
valueborrows 的方法self,没有任何其他参数,并返回一个u32.这是一种有时称为getter的方法,因为它的目的是从其字段中获取一些数据并将其返回.这个公共方法是必要的,因为struct 的value字段Guess是私有的.这是很重要的value领域是私人所以使用的代码Guess结构是不允许设置value直接: 模块外部用户 …