有时我们需要修改一个地方,但这里没有符合我们需求的内置功能.
例如,这里是incf和decf加法和减法:
CL-USER> (defvar *x* 5)
*X*
CL-USER> (incf *x* 3)
8
CL-USER> *x*
8
CL-USER> (decf *x* 10)
-2
CL-USER> *x*
-2
Run Code Online (Sandbox Code Playgroud)
但乘法和除法怎么样?如果我们希望修改具有任意功能的地方,如下所示:
(xf (lambda (x) ...) *x*)
Run Code Online (Sandbox Code Playgroud)
xf 实用程序非常有用,特别是当我们必须处理深层嵌套结构时:
(my-accessor (aref (cdr *my-data*) n))
Run Code Online (Sandbox Code Playgroud) 在阅读"Programming Clojure"时,我注意到在Clojure中有其他方法可以执行某些操作.例如,假设我们需要将字符串的所有字符转换为大写的变体.
我们可以使用.toUpperCase:
user> (.toUpperCase "foo")
;; => "FOO"
Run Code Online (Sandbox Code Playgroud)
以及clojure.string/upper-case:
user> (clojure.string/upper-case "foo")
;; => "FOO"
Run Code Online (Sandbox Code Playgroud)
虽然clojure.string/upper-case是一个功能,我们可以这样对待它:
user> (map clojure.string/upper-case ["foo" "bar" "baz"])
;; => ("FOO" "BAR" "BAZ")
Run Code Online (Sandbox Code Playgroud)
......我们不能这样做.toUpperCase:
user> (map .toUpperCase ["foo" "bar" "baz"])
CompilerException java.lang.RuntimeException: Unable to resolve symbol...
Run Code Online (Sandbox Code Playgroud)
我想这.toUpperCase是Java方法的直接调用,而Clojure知道如何处理这个符号,当它是表单的第一个元素时.
问:我应该使用什么.toUpperCase或者有clojure.string/upper-case什么区别:
(map clojure.string/upper-case ["foo" "bar" "baz"])
Run Code Online (Sandbox Code Playgroud)
和
(map (fn [x] (.toUpperCase x)) ["foo" "bar" "baz"])
Run Code Online (Sandbox Code Playgroud) 我需要让我的程序的一些小块在不同的平台上表现不同.看起来GHC不太擅长交叉编译,所以我打算在Linux和Windows上编译相同的代码.
建议的方法是什么?我是否必须编写一个模块的许多版本,或者有一些类似预处理器指令的东西可以放入我的代码中以有条件地编译一个代码块或另一个代码块?
PS我正在使用GHC和Cabal进行管理.
我们正在研究Parsec的分支(具有完整的QuickCheck测试套件,更好的错误消息和其他改进),并且已经取得了一些进展.大多数时候我使用Emacs的REPL,指定构建目标tests(即显然是测试套件的名称).这一直很好.
现在我们的东西通过测试,一切似乎都没问题,但如果我用库目标启动REPL(或省略它,即cabal repl或cabal repl lib:megaparsec)并做一些事情,我会让GHC恐慌:
?> parseTest (string "rere" <* eof) "reri"
ghc: panic! (the 'impossible' happened)
(GHC version 7.10.1 for x86_64-unknown-linux):
Loading temp shared object failed: /tmp/ghc9380_0/libghc9380_93.so: undefined symbol: _hpc_tickboxes_megapzuEw3SHAmfXgNLpm5a31oXO6_TextziMegaparsecziError_hpc
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug
Run Code Online (Sandbox Code Playgroud)
由于代码编译和工作正常cabal repl tests,我得出结论这不是我的编程错误无论如何,但可能是一个错误.
我找到了这张票:https://ghc.haskell.org/trac/ghc/ticket/10761,但我们的库不使用Template Haskell.
实际问题是:我该怎么做以及如何解决这个问题?我甚至无法判断它是Cabal还是GHC,我不知道如何构建可以重现问题的最小例子.
我已经报道了:
在黑客入侵时,我发现了这个:
!() <- atomicModifyIORef (eoExeCache eo) $ \m' ->
(Map.insert name epath m', ())
Run Code Online (Sandbox Code Playgroud)
HLint说:"删除那件事".但我认为这不是一个错字.有没有理由写!()?
var module = {};
(function(exports){
exports.notGlobalFunction = function() {
console.log('I am not global');
};
}(module));
function notGlobalFunction() {
console.log('I am global');
}
notGlobalFunction(); //outputs "I am global"
module.notGlobalFunction(); //outputs "I am not global"
Run Code Online (Sandbox Code Playgroud)
谁能帮我理解这里发生了什么?如果你打电话notGlobalFunction(),我会得到它,它只会调用第二个函数.
但是在var module = {}做什么?为什么在第一个函数内再次调用?
它说这通常被称为自动执行的匿名函数,但我不知道这意味着什么.
我正在解决99个Haskell Probems.我已成功解决了第21号问题,当我打开解决方案页面时,提出了以下解决方案:
将给定位置的元素插入列表.
insertAt :: a -> [a] -> Int -> [a]
insertAt x xs (n+1) = let (ys,zs) = split xs n in ys++x:zs
Run Code Online (Sandbox Code Playgroud)
我发现模式(n + 1)很有趣,因为它似乎是一种优雅的方式将基于1的参数转换为基于insertAt0的参数split(它的功能来自之前的练习,基本上相同splitAt).问题是GHC没有发现这种优雅的模式,事实上它说:
模式中的解析错误:n + 1
我不认为写这个答案的人是愚蠢的,我想知道这种模式在Haskell中是否合法,如果是,那么如何修复解决方案.
我正在尝试转移一些代码的执行,以使用GHC 8和编译时间
template-haskel-2.11。代码如下:
myThHelper :: FilePath -> Q Exp
myThHelper path =
runIO (compileThatFile path) >>= liftData
Run Code Online (Sandbox Code Playgroud)
这是该代码的简化版本,但希望可以传达我正在尝试做的事情。
注意该
liftData
函数,它是新函数,template-haskell-2.11并且承诺可以将的任何实例“提升”为表达式Data。很酷,可以编译。
但是,当我这样使用它时:
main :: IO ()
main = do
let compiled = $(myThHelper "/path/to/my/file/foo.txt")
…
Run Code Online (Sandbox Code Playgroud)
我从编译器收到以下错误消息:
• Can't find interface-file declaration for variable Data.Text.Internal.pack
Probable cause: bug in .hi-boot file, or inconsistent .hi file
Use -ddump-if-trace to get an idea of which file caused the error
• In the first argument of ‘PName’, namely
‘Data.Text.Internal.pack …Run Code Online (Sandbox Code Playgroud) 我已经读过,Common Lisp中的每个表单在评估时都会返回一些内容.但是,最近我一直在玩ASDF API并找到一个什么都不返回的函数:
CL-USER> (asdf:clear-output-translations)
; No value
Run Code Online (Sandbox Code Playgroud)
这怎么可能,为什么不回归NIL呢?
haskell ×6
function ×3
cabal ×2
common-lisp ×2
ghc ×2
lisp ×2
clojure ×1
java ×1
javascript ×1
macros ×1
midi ×1
return-value ×1