我查看了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) 我熟悉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规范中找到这个,但是找不到类似的东西.
我需要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)
完成这项工作的最快方法是什么?(你的数字应该是均匀分布的).
谢谢!
就像每个函数都被放在一个堆栈框架上执行它,并在完成后刷新它.因此,任何局部变量都不可用于其他函数.但那么我们如何能够将一个局部变量返回给调用者呢?
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) 考虑一下这个不卫生的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) 我现在学习 emacs lisp,我想知道为什么将代码视为数据可能有用。这种方法有什么好处。我看到了一种解释,因为这是对数据和代码之间存在明确分离的传统冯诺依曼架构的替代方案。我想了解这个决定的含义,明白了。
提前致谢,尼克。
我看到我可以使用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) 我厌倦了搜索,从来没有找到适合我需求的编程语言(我想大多数优秀的程序员都有同样的感觉).无论如何,我确实知道我喜欢什么编程语言,我想尝试开发自己的编程语言.我对它有多难以及需要多长时间(我的意思是获得一种最低限度有用的语言)的信息很感兴趣.我已经知道我需要什么资源了,但是我仍然觉得如果没有全身心地投入自己(或者让其他人帮助我,我认为不会发生这种情况)几乎不可能完成这样的事情.
无论如何 - 当我说"编程语言"和"最低限度有用"时,我已经准备好核心语言,用于调用C代码的FFI,以及至少与Quack一样有用的Emacs IDE .
我很感激任何经验报道......
谢谢!
当我在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) 我正在做一个接受一个列表和两个原子的程序,如果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的初学者.
请告诉我如何解决这个错误.