我很长一段时间都在使用这个功能而且很满意.你可能已经看过它数百万次了.甚至在Math.random()的MDN文档的示例部分中也是如此!
function random(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min
};
Run Code Online (Sandbox Code Playgroud)
然而,当我在非常大的范围内调用它时,它表现得非常糟糕.以下是一些结果:
for(var i=0;i<100;i++) { console.log(random(0, 34359738368)) }
34064924616
6800671568
30945277424
2591785504
16404206304
29609031808
14821448928
10712020504
26471102024
21454653384
33180253592
28189739360
27189739528
1159593656
24058421888
13727549496
21995862272
20907450968
28767901872
8055552544
2856286816
28137132160
22775692392
21141911808
16418994064
28151646560
19928528408
11100796192
24022825648
17873139800
10310184976
7425284936
27043756016
2521657024
2864339728
8080550424
8812058632
8867252312
18571554760
19600873680
33687248280
14707542936
28864740112
26338252144
7877957776
28207487968
2268429496
14461565136
28062983608
5637084472
29651319832
31910601904
19776200528
16996597392
2478335752 …Run Code Online (Sandbox Code Playgroud) 我在我的开发环境中使用Emacs和SLIME.当我输入(write-to然后C-M-i我得到以下自动填充:
Click on a completion to select it.
In this buffer, type RET to select the completion near point.
Possible completions are:
write-to-sting
write-to-string
Run Code Online (Sandbox Code Playgroud)
我知道Common Lisp很强大,但我猜write-to-sting不是ANSI标准.谷歌没有为这个功能提供一次点击.然后我试着在SBCL代码中找到它,但是唉
(documentation 'write-to-sting 'function)返回,nil因此它没有文档字符串.
当我尝试执行(write-to-sting)我得到的功能时The function COMMON-LISP-USER::WRITE-TO-STING is undefined.
Apropos还发现了一个未绑定的函数:
(apropos 'write-to)
WRITE-TO
WRITE-TO-STING
WRITE-TO-STRING (fbound)
Run Code Online (Sandbox Code Playgroud)
我的问题是:发生了什么事?有谁知道这个功能背后的故事?
我正在开发一个将alist转换为查询参数的函数.到目前为止它看起来像这样.
(defun encode-options (opts)
"Turns an alist into url query parameters."
(format nil "~{~{~A=~A~}~^&~}" opts))
Run Code Online (Sandbox Code Playgroud)
这对于像((a b) (c d))(结果"A=B&C=D")这样的列表非常有效,但对于像这样的虚线列表来说却失败了((a . b) (c . d)).(导致The value B is not of type LIST.)
我的问题是:虚线列表是否有可能format给我预期的结果以及如何?
我有两个包,每个包含相同的符号:
(make-package "package1")
(make-package "package2")
(intern "SYMBOL" (find-package "PACKAGE1"))
(intern "SYMBOL" (find-package "PACKAGE2"))
Run Code Online (Sandbox Code Playgroud)
我想比较它们.我需要能够像这样编写一个s表达式:
(package-agnostic-eq 'package1::symbol 'package2::symbol) ; => t
Run Code Online (Sandbox Code Playgroud)
这样做最优雅,最简单的方法是什么?
特别是我对内置运算符感兴趣.这是我想出的功能:
(defun package-agnostic-eq (sym1 sym2)
(string= (symbol-name sym1) (symbol-name sym2)))
Run Code Online (Sandbox Code Playgroud) 我经常使用包,导出的符号经常更改它们的名称。当我尝试重新编译包时,我收到如下警告:
package.lisp:3:1:
warning:
MY-PROJECT also exports the following symbols:
(OLD-SYMBOL1 OLD-SYMBOL2 OLD-SYMBOL3)
See also:
Common Lisp Hyperspec, DEFPACKAGE [:macro]
SBCL Manual, *ON-PACKAGE-VARIANCE* [:variable]
--> EVAL-WHEN
==>
(SB-IMPL::%DEFPACKAGE "MY-PACKAGE" '("KE") 'NIL 'NIL 'NIL '("CL") 'NIL
'NIL '("NEW-EXPORTED-SYMBOL1" "NEW-EXPORTED-SYMBOL2") '("MY-PROJECT") 'NIL
...)
Run Code Online (Sandbox Code Playgroud)
我知道我可以用来(unintern 'old-symbol1)向系统发出信号,我不想再使用该符号。然而,当有很多重命名时,这变得非常乏味。
我的问题是:
1)能够发信号通知sbcl或emacs以unintern旧的/先前导出的自动的符号?
2)如果不是 - 是否可以在变量中获取所有“旧”符号?
我的 2) 计划是对类似的东西进行键绑定 (apply #'unintern *old-symbols*)
我的一个线程进入了调试器。我想切换到它,期待该堆栈跟踪,选择重新启动,等等。我该怎么做?
我正在使用bordeaux-threads。
当我在学习HTML时,它是非常有益的,我知道ol的手段ordered list,tr是table row等,有些口齿不清基元/形式很简单:funcall应该是function call,defmacro- define macro.有些是在中间 - incf是...... increment... f???但是因为普通的口齿不清是如此古老,这种原始/特殊形式/等......似乎没有敲响钟声.你们能帮助我搞清楚吗?更重要的是:我在哪里可以找到关于学习每一个背后的意义/历史的权威资源?(我会接受基于第二个问题的答案)
该文档也没有帮助我:
* (describe #'let)
#<CLOSURE (:SPECIAL LET) {10013DC6AB}>
[compiled closure]
Lambda-list: (&REST ARGS)
Derived type: (FUNCTION (&REST T) NIL)
Documentation:
T
Source file: SYS:SRC;COMPILER;INFO-FUNCTIONS.LISP
* (documentation 'let 'function)
"LET ({(var [value]) | var}*) declaration* form*
During evaluation of the FORMS, bind the VARS to the result of evaluating the …Run Code Online (Sandbox Code Playgroud) 我将变量定义为包含符号列表的列表:
(defparameter *var* '((a a a) (a x a) (a a a)))
Run Code Online (Sandbox Code Playgroud)
setf当我尝试用...更改其中一个元素时
(setf (caar *var*) 'c)
Run Code Online (Sandbox Code Playgroud)
...第一个和最后一个列表均已更新。
> *var*
; ((c a a) (a x a) (c a a))
Run Code Online (Sandbox Code Playgroud)
我注意到,当我defparameter在 REPL 中评估 时,该setf命令按预期工作。这让我认为意外的行为与编译过程有关。
问题:
发生了什么以及为什么?
定义包含相同符号的新列表的规范方法是什么defparameter?
我正在使用 SBCL。
编辑:我的问题与这个问题不相似,因为我不是问如何复制列表以便它们不共享结构,而是问为什么在编译defparameter具有相似元素的列表时似乎共享结构以及如何定义它们以便它们共享结构不是。
想象一下我有一节课:
(defclass person () ())
Run Code Online (Sandbox Code Playgroud)
然后我做了一些实例:
(setf anna (make-instance 'person))
(setf lisa (make-instance 'person))
Run Code Online (Sandbox Code Playgroud)
如何获取对象本身或分配给它们的符号名称?
我希望能够说出类似的(find-instances 'person)东西,(anna lisa)或者至少得到类似的东西(#<PERSON {100700E793}> #<PERSON {100700E793}>).
我搜索的是相当于ruby中的each_object.
我非常希望能够在没有外部库的情况下完成它.
我需要比较两个字符串,以忽略该assoc :test函数的大小写。我知道我可以像这样轻松编写函数:
(defun cistring= (str1 str2)
(string= (string-downcase str1)
(string-downcase str2)))
Run Code Online (Sandbox Code Playgroud)
但是我想知道:是否有内置的不区分大小写的string=?也许我只是找不到?
common-lisp ×9
sbcl ×3
lisp ×2
clos ×1
compilation ×1
completion ×1
javascript ×1
largenumber ×1
random ×1
slime ×1