小编Jay*_*Jay的帖子

如何在Haskell中以隐藏的方式初始化状态(就像PRNG那样)?

我查看了State monad的一些教程,我想我有了这个想法.

例如,在这个很好的教程中:

import Data.Word

type LCGState = Word32

lcg :: LCGState -> (Integer, LCGState)
lcg s0 = (output, s1) 
  where s1 = 1103515245 * s0 + 12345
        output = fromIntegral s1 * 2^16 `div` 2^32


getRandom :: State LCGState Integer
getRandom = get >>= \s0 -> let (x,s1) = lcg s0
                           in put s1 >> return x
Run Code Online (Sandbox Code Playgroud)

好的,所以我可以使用getRandom:

*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 0
(0,12345)
*Main> runState getRandom 1              
(16838,1103527590)
Run Code Online (Sandbox Code Playgroud)

但是我每次打电话都需要把种子传给PRNG.我知道Haskell实现中可用的PRNG不需要:

Prelude> :module Random …
Run Code Online (Sandbox Code Playgroud)

monads haskell state-monad

4
推荐指数
1
解决办法
868
查看次数

如何判断变量的值是否是绑定到Scheme中过程的符号?

我熟悉Common Lisp并尝试学习一些Scheme,所以我一直在努力理解我如何使用Scheme来解决我通常在Common Lisp中编写的问题.

在Common Lisp中fboundp,它告诉我符号(变量的值)是否与函数绑定.所以,我会这样做:

(let ((s (read)))
  (if (fboundp s)
      (apply (symbol-function s) args)
      (error ...)))
Run Code Online (Sandbox Code Playgroud)

这可能在Scheme中吗?我一直试图在R6RS规范中找到这个,但是找不到类似的东西.

lisp scheme functional-programming common-lisp

3
推荐指数
1
解决办法
947
查看次数

如何获取julia范围内的BigInt随机数?

我需要BigInt在Julia中获得1到1之间的随机数,但我在文档中找不到如何做到这一点.下面的代码是我认为可行的:

julia> rand(BigInt(1):BigInt(2^1000))
ERROR: integer division error
 in randu at random.jl:158
 in rand at random.jl:178
 in rand at random.jl:187
Run Code Online (Sandbox Code Playgroud)

编辑:提到的GregS 2^1000会绕零.实际上,2^1000结果为零,所以上面的代码是错误的.但使用BigInt(2)^1000不起作用:

julia> rand(BigInt(1):BigInt(2)^1000)
ERROR: InexactError()
 in convert at gmp.jl:108
 in colon at range.jl:38

julia> rand(BigInt(1):BigInt(2)^BigInt(1000))
ERROR: InexactError()
 in convert at gmp.jl:108
 in colon at range.jl:38
Run Code Online (Sandbox Code Playgroud)

完成这项工作的最快方法是什么?(你的数字应该是均匀分布的).

谢谢!

random arbitrary-precision julia

3
推荐指数
1
解决办法
524
查看次数

堆栈帧内存分配

就像每个函数都被放在一个堆栈框架上执行它,并在完成后刷新它.因此,任何局部变量都不可用于其他函数.但那么我们如何能够将一个局部变量返回给调用者呢?

int pickMin( int x, int y, int z ) {
 int min = x ;
 if ( y < min )
    min = y ;
 if ( z < min )
    min = z ;
 return min ;   }
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常.但是在下面的代码中,编译器确实给出了一条警告信息 - " warning: function returns address of local variable [-Wreturn-local-addr] return a;"但是它最后打印了一个垃圾值,我认为这很好,因为变量已经被刷新了.但为什么不在ABOVE计划中发生这种情况?!我的意思是,它也应该给我一个垃圾malloc值.而且,我知道下面代码中的问题可以使用,然后返回该值来解决.:)

int *returnarray(){
 int a[10]; int i;
  for(i=0;i<10;++i){
     a[i] = i;
 }return a;}   
Run Code Online (Sandbox Code Playgroud)

c stack

3
推荐指数
1
解决办法
909
查看次数

Scheme中使用define-macro进行变量捕获的机制

考虑一下这个不卫生的Scheme宏:

(define-macro for
  (lambda (i i1 i2 . body)
    (let ((start (gensym))
          (stop  (gensym))
          (loop  (gensym)))
      `(let ((,start ,i1)
             (,stop  ,i2))
         (let ,loop ((,i ,start))
              (if (< ,i ,stop)
                  (begin ,@body
                         (,loop (+ 1 ,i)))))))))
Run Code Online (Sandbox Code Playgroud)

它实现了一个for循环(我正在使用Gauche和Gambit):

> (for i 1 5
       (print i))
1
2
3
4
#

但是,由于我没有重命名if,这肯定会破坏:

(let ((if 'x))
  (for i 1 5
       (print i)))
Run Code Online (Sandbox Code Playgroud)

它开始计数,永不停止.

现在,我已经尝试过宏扩展这个并且无法确切地看到它为什么循环而不仅仅是发出错误信号.

Gambit的扩展(没有if重新定义部分)是这样的:

(let ((#:start15 1)
      (#:stop16 5))
 ((letrec ((#:loop17 (lambda (i) 
                       (if (< i #:stop16) 
                           (begin (print i) …
Run Code Online (Sandbox Code Playgroud)

macros scheme

2
推荐指数
1
解决办法
548
查看次数

为什么在 lisp 中将代码视为数据很有用

我现在学习 emacs lisp,我想知道为什么将代码视为数据可能有用。这种方法有什么好处。我看到了一种解释,因为这是对数据和代码之间存在明确分离的传统冯诺依曼架构的替代方案。我想了解这个决定的含义,明白了。

提前致谢,尼克。

lisp emacs macros eval homoiconicity

2
推荐指数
1
解决办法
282
查看次数

像mapM,但对于数组?(像arrayMap,但映射不纯的函数)

我看到我可以使用mapArray在可变数组上映射函数,但似乎没有像mapM(和mapM_)那样的东西.mapArray不会让我打印它的元素,例如:

import Data.Array.Storable

arr <- newArray (1,10) 42 :: IO  -- answer to Life, Universe and Everything
x <- readLn :: IO Int
mapArray (putStrLn.show) arr -- <== this doesn't work!
Run Code Online (Sandbox Code Playgroud)

结果将是:

No instances for (MArray StorableArray Int m,
                  MArray StorableArray (IO ()) m)
  arising from a use of `mapArray' at <interactive>:1:0-27
Possible fix:
  add an instance declaration for
  (MArray StorableArray Int m, MArray StorableArray (IO ()) m)
In the expression: mapArray (putStrLn . show) arr
In the definition of …
Run Code Online (Sandbox Code Playgroud)

arrays monads haskell

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

开发完整的编程语言,编译器和IDE需要多少时间和精力?

我厌倦了搜索,从来没有找到适合我需求的编程语言(我想大多数优秀的程序员都有同样的感觉).无论如何,我确实知道我喜欢什么编程语言,我想尝试开发自己的编程语言.我对它有多难以及需要多长时间(我的意思是获得一种最低限度有用的语言)的信息很感兴趣.我已经知道我需要什么资源了,但是我仍然觉得如果没有全身心地投入自己(或者让其他人帮助我,我认为不会发生这种情况)几乎不可能完成这样的事情.

无论如何 - 当我说"编程语言"和"最低限度有用"时,我已经准备好核心语言,用于调用C代码的FFI,以及至少与Quack一样有用的Emacs IDE .

我很感激任何经验报道......

谢谢!

ide compiler-construction programming-languages

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

为什么Common Lisp的apply函数给出了不同的结果?

当我在Emacs上尝试此代码时SLIME,该apply函数会给出不同的结果.是不是应该给出相同的结果?为什么它会给出不同的结果?谢谢.

CL-USER> (apply #'(lambda (n)
             (cons n '(b a))) '(c)) 

(C B A)

CL-USER> (cons '(c) '(b a)) 

((C) B A)
Run Code Online (Sandbox Code Playgroud)

common-lisp

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

Common Lisp:错误"CDR LST应该是lambda表达式"

我正在做一个接受一个列表和两个原子的程序,如果atom-1出现在列表中,则用atom-2替换atom-1.
我正在使用Ubuntu系统在文本编辑器中进行编程

以下是我的代码:

#! /usr/bin/clisp

(defun my-replace (lst x y)
  (cond
    ((eq lst nil) nil)
    ((eq (cdr lst) nil) nil)
    ((eq (car lst) x) (setq (car lst) y))
    ( t (my-replace ((cdr lst) x y)))))
Run Code Online (Sandbox Code Playgroud)

当我尝试执行此操作时,Clisp显示以下错误:

*** - SYSTEM::%EXPAND-FORM: (CDR LST) should be a lambda expression

我是Lisp的初学者.
请告诉我如何解决这个错误.

lisp recursion clisp common-lisp

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

如何检测子进程已崩溃?

子进程可以:

  • 正常退出(通过使用exit(0), exit(22),退出exit(23))——这显然特定于我的应用程序
  • 异常退出(代码抛出异常、收到未处理的信号、核心转储等...)

我正在从父进程执行 fork/exec 并循环waitpid,当我检测到子进程已退出时,我想确定它退出的原因。

目前我检查WEXITSTATUS(status)status返回的位置waitpid)以确定退出代码。

有没有办法可靠地检测孩子是否异常退出?

c linux

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