在学习 Raku 的同时,我到达了高阶函数和排序函数的点。
我有这个例子:
> sort <4 6 2 9 1 5 11>
(1 2 4 5 6 9 11)
Run Code Online (Sandbox Code Playgroud)
然后例程的文档是这样说的:
Sorts the list, smallest element first. By default infix:<cmp> is used for
comparing list elements.
Run Code Online (Sandbox Code Playgroud)
我正在关注的那本书“Piensa en raku”在第 9.2 节中对数字排序和字典排序进行了比较。
我尝试了以下方法:
> sort &le, <4 6 2 9 1 5 11>;
===SORRY!=== Error while compiling:
Undeclared routine:
le used at line 1. Did you mean 'lc'?
Run Code Online (Sandbox Code Playgroud)
但是遇到这个问题,而不是按字典顺序排列的排序列表。所以可能对我来说理解这一点还为时过早,但应该可以像函数一样在 Raku 中传递一个运算符,因为文档还说它正在使用中缀:或者我需要做这样的事情,也许我' m 混淆运算符和子程序:
sub my-le($a,$b) {
$a le $b; …
Run Code Online (Sandbox Code Playgroud) 有一个练习,我需要定义阿克曼函数。
我定义了一个正整数子集:
subset Positive-Integer of Int where { $_ > 0}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方法遍历递归版本:
multi ackermann(0, Positive-Integer $n) {
$n + 1;
}
multi ackermann(Positive-Integer $m, 0) {
ackermann $m - 1, 1;
}
multi ackermann(Positive-Integer $m, Positive-Integer $n) {
ackermann $m - 1, ackermann $m, $n - 1;
}
Run Code Online (Sandbox Code Playgroud)
但是执行我在执行时得到的代码:
阿克曼 3, 4;
> * * &ackermann
> > * * &ackermann
> > * * &ackermann
> > ackermann 3, 4
Cannot resolve caller ackermann(Int:D, …
Run Code Online (Sandbox Code Playgroud) 这里的问题是我不太明白控制流中语句和块之间的区别。
查看三元运算符,我可以使用它来分配变量。但这是一个运算符,所以它就像应用一个函数——不是吗?
> my $variable = True ?? 34 !! 42;
34
Run Code Online (Sandbox Code Playgroud)
因为在 raku 文档中说:
if
要有条件地运行代码块,请使用
if
后跟条件。条件,一个表达式,将在语句if
结束前立即计算。附加到条件的块只会在条件意味着True
强制为 Bool 时进行评估。与某些语言不同,条件不必用括号括起来,而是块{
和}
周围是强制性的:
do
运行不能是独立语句的块的最简单方法是
do
在它之前写入:
所以这应该适用于两种情况:
> my $variable = do {34};
34
> my $variable = if True {34;} else {43;}
===SORRY!===
Word 'if' interpreted as a listop; please use 'do if' to introduce the statement control word
------> my $variable = if? True {34;} else {43;} …
Run Code Online (Sandbox Code Playgroud) 解决Euler项目问题我得到的是我需要使用长数字的数字作为字符串进行操作.我使用sbcl在linux,emacs,slime中工作.
例如,为了得到这个数字2的数字之和,我这样工作,
1)获得力量
CL-USER> (defparameter *answer-as-integer* (expt 2 1000))
*ANSWER-AS-INTEGER*
CL-USER> *ANSWER-AS-INTEGER*
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
Run Code Online (Sandbox Code Playgroud)
感谢Common Lisp,这非常简单.现在我相信一个好方法应该是将reduce应用于这个数字序列.
2)获取字符串
CL-USER> (defparameter *answer-as-string* (write-to-string *ANSWER-AS-INTEGER*))
*ANSWER-AS-STRING*
CL-USER> *ANSWER-AS-STRING*
"10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376"
Run Code Online (Sandbox Code Playgroud)
现在我有了序列,所以应用reduce,但是我得到错误的东西:这是一个char所以我将转换字符应用于整数:
CL-USER> (reduce #'(lambda (x y) (+ (digit-char-p x) (digit-char-p y))) *ANSWER-AS-string*)
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
The value 1 is not of type CHARACTER.
[Condition of type TYPE-ERROR]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT] Abort thread (#<THREAD "repl-thread" RUNNING {1005DE80B3}>)
Backtrace:
0: (DIGIT-CHAR-P 1) [optional]
1: ((LAMBDA …
Run Code Online (Sandbox Code Playgroud) 我需要将所有提交放在一个名为初始快照的提交中,以便在github Repo中释放它,我知道为了这样做我遵循这个
我的第一个问题是我想与外部存储库共享它,这说:
需要注意的是:只在尚未推送到外部存储库的提交中执行此操作.如果其他人的工作基于您要删除的提交,则可能会发生许多冲突.如果已经与他人共享,请不要重写您的历史记录.
我想把所有提交放在一个单一的提交中会发生什么,如何做到这一点:
我发现了这个:
# Switch to the master branch and make sure you are up to date.
git checkout master
git fetch # this may be necessary (depending on your git config) to receive updates on origin/master
git pull
# Merge the feature branch into the master branch.
git merge feature_branch
# Reset the master branch to origin's state.
git reset origin/master
# Git now considers all changes as unstaged changes.
# We can add these …
Run Code Online (Sandbox Code Playgroud) 使用 rakubrew 升级 rakudo 版本时,更改版本非常容易,但我想知道是否可以将 raku 模块从旧版本导入到新版本。doign zef 自动安装:
更新:
rakubrew build 2020.10
Run Code Online (Sandbox Code Playgroud)
但是之后:
? raku
Welcome to ™ v2020.10.
Implementing the ™ programming language v6.d.
Built on MoarVM version 2020.10.
You may want to `zef install Readline` or `zef install Linenoise` or use rlwrap for a line editor
To exit type 'exit' or '^D'
Run Code Online (Sandbox Code Playgroud)
所以我需要安装我目前使用的所有模块:
rakubrew build-zef zef 安装 Sparrow6 zef 安装 Linenoise
因此存在任何文件 .zef 或 .rakubrew 或检查以自动维护此模块的东西
我可以反省 Raku 中的例程,例如say
例程:
[5] > &say.WHAT
(Sub)
[6] > &say.^mro
((Sub) (Routine) (Block) (Code) (Any) (Mu))
Run Code Online (Sandbox Code Playgroud)
但我如何自省诸如+
(doc page)之类的操作符?
[7] > &+.WHAT
Use of uninitialized value of type Callable in numeric context
in block <unit> at <unknown file> line 1
in any <main> at /home/toni/.rakubrew/versions/moar-blead/install/share/perl6/runtime/perl6.moarvm line 1
in any <entry> at /home/toni/.rakubrew/versions/moar-blead/install/share/perl6/runtime/perl6.moarvm line 1
Use of uninitialized value of type Any in numeric context
in block <unit> at <unknown file> line 1
in any <main> …
Run Code Online (Sandbox Code Playgroud) 最近,我开始学习cuis-smalltalk,并且我没有意识到使用Smalltalk的深度和深度OOP与CLOS(我使用Ruby)相比.我了解到Smalltalk本身就是一个反射系统的好主意.我发现Ruby有Rubinius,但是当我找到用Lisp编写的Common Lisp实现时,我找不到类似的东西.似乎没有用CL编写的CL分发.
在使用CLOS和slime的Common Lisp中,您可以完成与Smalltalk Development环境相关的所有操作.
但我有一个问题,如果Common Lisp实现本身对Common Lisp有用吗?或者不会添加任何特殊的语言,因为homoiconicity,宏和MOP可以处理所有.是否存在无法完成的技术限制?
阅读 Raku 文档后,我只发现这是为了取消定义变量。我相信在 Raku 中,赋值和绑定之间存在差异。
定义和取消定义标量很容易。
> my $n
(Any)
> $n.defined
False
> $n = 3
3
> $n.defined
True
> $n = Nil
(Any)
> $n.defined
False
Run Code Online (Sandbox Code Playgroud)
当变量被绑定时,这是不可能的。
> my $k := 5
5
> $k := Nil
===SORRY!=== Error while compiling:
Cannot use bind operator with this left-hand side
at line 2
------> <BOL>?<EOL>
> $k = Nil
Cannot assign to an immutable value
in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)
对于数组或散列,我可以清空它,但变量仍然被定义。
对于函数,当你用 定义一个函数时 …
我正在尝试从Paul Graham学习Common Lisp阅读Ansi Common Lisp并使用EEC325 课程评论和运行测试功能和讲座.我用粘液和SBCL设置了Emacs
问题在于第3章练习8说:
定义一个获取列表并以点表示法打印的函数:
Run Code Online (Sandbox Code Playgroud)> (showdots ' ( a b c)) (A . (B . (C . NIL))) NIL
我做了以下函数,结果是一个字符串,它适用于案例,但不打印这是练习的主要目标
(defun show-dots (lst)
(cond
((atom lst) (format nil "~A" lst ))
((consp lst) (format nil "(~A . ~A)"
(show-dots (car lst))
(show-dots (cdr lst))))))
Run Code Online (Sandbox Code Playgroud)
问题是它产生的字符串不会打印字符串,但它可以工作
CS325-USER> (SHOW-DOTS '(A B C))
"(A . (B . (C . NIL)))"
CS325-USER> (SHOW-DOTS '(A (B C)))
"(A . ((B . (C . NIL)) . NIL))"
CS325-USER> (SHOW-DOTS '(A . …
Run Code Online (Sandbox Code Playgroud)