为了提高我的 Lisp 程序的效率,我想在我的代码中插入这一行:
(optimize (speed 3) (safety 0) (debug 0) (space 0))
Run Code Online (Sandbox Code Playgroud)
目前我认为我应该把它放在每个文件的顶部。这是一个好主意还是我应该在一个特定的地方插入这一行?(我使用 ASDF 进行系统定义。)
我问题的另一部分:(safety 0)安全吗?我的函数很少使用变量类型的显式声明,其他函数会发生什么?我应该省略(safety 0)以避免由于缺少类型检查而可能发生的问题吗?
我在Common Lisp上编写了一种DSL.该域非常奇怪,我的语言与Common Lisp本身完全不同.我已将所有界面放入包中foo:
(defpackage :foo
(:use :common-lisp
:internal-machinery)
(:shadow :in-package
:*packages*))
Run Code Online (Sandbox Code Playgroud)
包间的切换是超越语言的概念,所以我被遮蔽的符号已停用这项能力in-package和*package*.现在我的语言的用户(程序员)将无法切换包.精细.
显然,我想使用Common Lisp编译器来编译用这种语言编写的程序.功能compile-file看起来不错.但是有困难.
我想编译一个文件,好像它的内容在我的foo包中.(in-package :foo)使用我的原型语言放在每个程序之上是一个不受欢迎的选择.
更糟糕的是,我必须在函数内编译一个文件:
(in-package :internal-machinery)
(defun compile-stuff (filename)
(in-package :foo) ; it will have no effect, because
; this macro must be top level form
(compile-file filename) ; other options are omitted
(in-package :internal-machinery)) ; no way, even if it were top level
; form, in-package is shadowed
Run Code Online (Sandbox Code Playgroud)
我不知道是否可能,所以任何帮助将不胜感激.
我有一个程序可以将结果只输出到文件,并带有-o选项.这次我需要将它输出到控制台,即stdout.这是我的第一次尝试:
myprog -o /dev/stdout input_file
Run Code Online (Sandbox Code Playgroud)
但它说:
/ dev/not writable
我发现这个问题与我的相似,但/dev/stdout如果没有额外的魔法,显然不会有效.
问:如何将文件中的输出重定向到stdout?
PS没有任何专用软件的传统方法是优选的.
我找不到一种方法来呈现链接,然后在它之后使用逗号或句号,链接和标点符号之间没有空格。这是我的初步尝试:
<p>
You can find more information #
<a href="@{SomeRouteR}">here
\.
Run Code Online (Sandbox Code Playgroud)
或者
<p>
You can find more information #
<a href="@{SomeRouteR}">here
.
Run Code Online (Sandbox Code Playgroud)
这会在单词“here”和“.”之间插入空格。
另一种选择是:
<p>
You can find more information #
<a href="@{SomeRouteR}">here</a>.
Run Code Online (Sandbox Code Playgroud)
这看起来像一个胜利,但 HTML 格式错误:
<p>You can find more information <a href="…">here</a>.</a></p>
Run Code Online (Sandbox Code Playgroud)
有没有办法避免链接和标点符号/其他元素之间的空格?
通常我需要用相同类型的另一个序列替换某些元素的子序列,但是,可能具有不同的长度.实现这样的功能不是挑战,这就是我现在使用的:
(defun substitute* (new old where &key key (test #'eql))
(funcall (alambda (rest)
(aif (search old rest :key key :test test)
(concatenate (etypecase rest
(string 'string)
(vector 'vector)
(list 'list))
(subseq rest 0 it)
new
(self (subseq rest (+ it (length old)))))
rest))
where))
Run Code Online (Sandbox Code Playgroud)
像这样工作:
CL-USER> (substitute* '(x y) '(z) '(1 z 5 8 y z))
(1 X Y 5 8 Y X Y)
CL-USER> (substitute* "green button" "red button"
"here are red indicator, red button and red wire")
"here …Run Code Online (Sandbox Code Playgroud) 比方说,我们想使用一个需要谓词的函数,但由于某种原因,我们对函数的其他功能(如:start和:end参数)感兴趣,所以我们需要提供一个始终返回true的谓词.
显然,这根本不是问题:
CL-USER> (defparameter *list* '(0 1 2 3 4 5))
*LIST*
CL-USER> (remove-if (lambda (x) t) *list* :start 1 :end 3)
(0 3 4 5)
Run Code Online (Sandbox Code Playgroud)
工作,但根本不是很好.我们可能会得到一个丑陋的消息,x即不使用变量.因为我在美丽的LISP,我很好奇是否有一个'总是'的谓词?
我们可以定义它:
(defun tp (&rest rest)
(declare (ignore rest))
t)
Run Code Online (Sandbox Code Playgroud)
..但它可能存在吗?
是否有一个库将整数转换为字符串,以便它们(整数)表示为单词?例如:
21 =>"二十一"
我也有兴趣将整数转换为表示罗马数字的字符串:
21 =>"XXI"
编写这样的转换函数对我来说不是问题,但我不想重新发明轮子.
positions2 :: (Eq a) => a -> [a] -> [Int]
positions2 = f where
f aa aas = filter (g aa aas) [0 .. (length aas - 1)]
g aa aas it = aa == aas !! it
Run Code Online (Sandbox Code Playgroud)
此代码用于查找给定列表中给定元素的位置.
为了找出它的复杂性,我想到了filter一个函数g和一个列表[0..length-1].
现在,我想不出什么的复杂性positions2会(n)或会有任何环路事情,由于filter功能.
请建议是否有任何其他方法来编写更紧凑的代码,以降低复杂性.
Lisp noob在这里.
CL-USER> (defun my-if (a b c)
(cond (a b)
(t c)))
CL-USER> (my-if t (print 1) (print 2))
1
2
1
Run Code Online (Sandbox Code Playgroud)
我没想到得到2,因为cond如果第一个为真,则不应该评估第二个子句:
CL-USER> (cond (t (print 1))
(t (print 2)))
1
1
Run Code Online (Sandbox Code Playgroud)
这是为什么我们需要宏,还是我犯了其他错误?
好吧,我不知道怎么做,但是知道Haskell是一种无限深度的语言,我决定在放弃之前问这个问题.
假设我们有一个多态的值,例如:
foo :: Monad m => m Int
foo = return Int
Run Code Online (Sandbox Code Playgroud)
显然,根据上下文,m可以实例化为不同的类型.我想知道现在是否可以采用这段抽象代码并在同一函数内的几个不同的上下文中使用它(例如在覆盖代码时减少样板):
bar :: Monad m => m Int -> Property
bar m = conjoin
[ checkIt (runIdentityT m)
, checkIt (runReaderT m ())
, …
]
Run Code Online (Sandbox Code Playgroud)
哪里checkIt接受一些具体的monad.由于foo本质上是抽象的描述如何做某事,应该可以在几个上下文中使用它,但问题显然是如果我们承诺使用任何Monad m => m Int签名bar,那么我们就不能在不太抽象的层次上编写这个函数了它不可能适应Monad其实现中的每个可能的实例.
有没有办法通过foo进入bar这样就可以在里面几个类型的环境中使用?
common-lisp ×5
lisp ×5
haskell ×3
bash ×1
clojure ×1
compilation ×1
function ×1
hamlet ×1
integer ×1
package ×1
performance ×1
predicate ×1
prototyping ×1
replace ×1
sequence ×1
shell ×1
stdout ×1
string ×1
unix ×1
yesod ×1