小编Mar*_*ark的帖子

如何修改具有任意功能的地方

有时我们需要修改一个地方,但这里没有符合我们需求的内置功能.

例如,这里是incfdecf加法和减法:

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)

lisp macros common-lisp variable-assignment

7
推荐指数
2
解决办法
184
查看次数

库函数与Clojure中的Java方法

在阅读"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)

java function clojure

7
推荐指数
2
解决办法
733
查看次数

在Haskell中创建MIDI文件

我想创建一个生成MIDI文件的简单程序.不,我不想使用Haskore,因为这个项目有点过分.我认为像这个库这样的东西就足够了.

我希望能做什么:

  • 创建新的MIDI文件;
  • 把一些事件写进去(我想及时控制速度,音高和位置);
  • 保存MIDI文件.

就这么简单,我敢打赌它并不难,但我找不到任何好的例子如何去做.

请提供一个基本示例或指出我在哪里可以找到有关在Haskell中创建MIDI文件的信息.

注意:我不是在问你关于好库的问题,我问你如何在Haskell中做到这一点(对于你认为在例子中使用的任何库而言).

midi haskell

7
推荐指数
1
解决办法
849
查看次数

Haskell中的多平台开发

我需要让我的程序的一些小块在不同的平台上表现不同.看起来GHC不太擅长交叉编译,所以我打算在Linux和Windows上编译相同的代码.

建议的方法是什么?我是否必须编写一个模块的许多版本,或者有一些类似预处理器指令的东西可以放入我的代码中以有条件地编译一个代码块或另一个代码块?

PS我正在使用GHC和Cabal进行管理.

haskell ghc cabal

7
推荐指数
1
解决办法
171
查看次数

GHC恐慌:加载临时共享对象失败

我们正在研究Parsec的分支(具有完整的QuickCheck测试套件,更好的错误消息和其他改进),并且已经取得了一些进展.大多数时候我使用Emacs的REPL,指定构建目标tests(即显然是测试套件的名称).这一直很好.

现在我们的东西通过测试,一切似乎都没问题,但如果我用库目标启动REPL(或省略它,即cabal replcabal 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,我不知道如何构建可以重现问题的最小例子.


我已经报道了:

https://ghc.haskell.org/trac/ghc/ticket/10765#ticket

haskell ghc cabal

7
推荐指数
1
解决办法
247
查看次数

真的需要单位的爆炸模式吗?

在黑客入侵时,我发现了这个:

!() <- atomicModifyIORef (eoExeCache eo) $ \m' ->
    (Map.insert name epath m', ())
Run Code Online (Sandbox Code Playgroud)

HLint说:"删除那件事".但我认为这不是一个错字.有没有理由写!()

haskell lazy-evaluation

7
推荐指数
1
解决办法
125
查看次数

什么是自执行匿名函数或者这段代码在做什么?

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 = {}做什么?为什么在第一个函数内再次调用?

它说这通常被称为自动执行的匿名函数,但我不知道这意味着什么.

javascript function self-executing-function

6
推荐指数
1
解决办法
9561
查看次数

一个有趣的模式

我正在解决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中是否合法,如果是,那么如何修复解决方案.

haskell design-patterns

6
推荐指数
2
解决办法
163
查看次数

找不到变量的inerface文件声明

我正在尝试转移一些代码的执行,以使用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)

haskell template-haskell

6
推荐指数
1
解决办法
297
查看次数

Common Lisp函数没有返回任何值

我已经读过,Common Lisp中的每个表单在评估时都会返回一些内容.但是,最近我一直在玩ASDF API并找到一个什么都不返回的函数:

CL-USER> (asdf:clear-output-translations)
; No value
Run Code Online (Sandbox Code Playgroud)

这怎么可能,为什么不回归NIL呢?

lisp function common-lisp return-value

5
推荐指数
2
解决办法
797
查看次数