我想让Emacs,SLIME和quicklisp正常合作.我有以下环境设置:
(quicklisp-quickstart:install)在SBCL中运行(ql:add-to-init-file)在SBCL中运行(ql:quickload "quicklisp-slime-helper")在SBCL中运行(ql:quickload "cl-csv")在SBCL中使用安装的包cl-csv(setq inferior-lisp-program "sbcl")到.emacs(load (expand-file-name "~/quicklisp/slime-helper.el"))到.emacs我有一个test.lisp文件,首先(ql:quickload "cl-csv")加载包并使用它.当我将文件加载到Emacs并运行SLIME,然后尝试使用它编译它slime-compile-and-load-file,我得到SBCL中的错误Package CL-CSV does not exist.
我错过了什么让这些作品正确地协同工作?
我正在学习Common Lisp,想要玩lisp和web开发.我目前的问题来自一个简单的想法,迭代我想要包括的所有JavaScript文件.我使用SBCL和Quicklisp进行快速启动.问题可能与cl-who我正在使用的包有关.
所以我宣布了我的包,并开始这样:
(defpackage :0xcb0
(:use :cl :cl-who :hunchentoot :parenscript))
(in-package :0xcb0)
Run Code Online (Sandbox Code Playgroud)
为了简单起见,我减少了我的问题功能.所以我有这个page功能:
(defun page (test)
(with-html-output-to-string
(*standard-output* nil :prologue nil :indent t)
(:script
(:script :type "text/javascript" :href test))))
Run Code Online (Sandbox Code Playgroud)
这将产生所需的输出
*(0xcb0::page "foo")
<script>
<script type='text/javascript' href='foo'></script>
</script>
Run Code Online (Sandbox Code Playgroud)
现在我已经创建了一个生成:script标签的宏.
(defmacro js-source-file (filename)
`(:script :type "text/javascript" :href ,filename)))
Run Code Online (Sandbox Code Playgroud)
这按预期工作:
*(macroexpand-1 '(0XCB0::js-source-file "foo"))
(:SCRIPT :TYPE "text/javascript" :HREF "foo")
Run Code Online (Sandbox Code Playgroud)
但是,如果我将此包含在我的page函数中:
(defun page (test)
(with-html-output-to-string
(*standard-output* nil :prologue nil :indent t)
(:script
(js-source-file "foo"))))
Run Code Online (Sandbox Code Playgroud)
... undefined function: …
我正在将一些Scheme代码转换为Common Lisp.我不知道Scheme.我知道一点Common Lisp.
这是Scheme代码:
(define (close-enuf? h1 h2 #!optional tolerance scale)
(if (default-object? tolerance)
...))
Run Code Online (Sandbox Code Playgroud)
我将该Scheme代码转换为此Common Lisp:
(defun close-enuf? (h1 h2 &optional tolerance scale)
(if (xxx tolerance)
...))
Run Code Online (Sandbox Code Playgroud)
除此之外xxx,这看起来不错吗?
现在,关于xxx什么是Common Lisp等价物default-object?
我找到了这个定义default-object?:
The predicate default-object?, which is true only of default objects, can be used to determine which optional parameters were supplied, and which were defaulted.
Run Code Online (Sandbox Code Playgroud)
我不确定那是什么意思.是否说default-object?如果参数的值是默认值(不是传入的值),则返回true?
我正在尝试编写一个函数来确定一个单词是否是回文。我做了这个,但它总是返回“不是回文”。我不知道发生了什么。
(defun palindromo (X)
(setq i 0)
(setq j (- (length X) 1))
(setq bandera 0)
(loop while (< j i)
do
(when (char= (char X i) (char X j))
(+ i 1)
(- j 1)
(setq bandera 1))
(unless (char/= (char X i) (char X j))
(setq bandera 0)
)
)
(cond
((equal 0 bandera) (write "Is not a palindrome"))
((equal 1 bandera) (write "Is a palindrome"))
)
)
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
该floorHyperspec对文章dotimes有这个例子:
(defun palindromep (string &optional
(start 0)
(end (length string)))
(dotimes (k (floor (- end start) 2) t)
(unless (char-equal (char string (+ start k))
(char string (- end k 1)))
(return nil))))
Run Code Online (Sandbox Code Playgroud)
如果floor返回两个值,例如(floor 5 2)- > 2和1,如何dotimes知道只使用第一个值而忽略第二个值的计数形式?
我正在尝试创建一个程序来计算每周员工的总工资。
这是我的代码
(princ"Enter working hours: ")
(defparameter workhours(read))
(if (and (>= workhours 0)) (<= workhours 60))
(princ"Enter hourly pay rate: ")
(defparameter HPrate(read))
(if(<= workhours 40)
(* workhours HPrate))
Run Code Online (Sandbox Code Playgroud)
我很难在 lisp 中构建这个 40*HPrate + (workhours - 40) * HPrate * 1.5
这是公式
(Regular hours/week) Gross Pay = Hours X Rate
(With Overtime) Over Time Pay = ( Hours - 40 ) X Rate X 1.5
Gross Pay = 40 X Rate + Over Time Pay
Run Code Online (Sandbox Code Playgroud) 在Ada中,类型T的原始操作只能在定义了T的包中定义.例如,如果Vehicules包定义Car并Bike标记了记录,两者都继承了一个通用的Vehicle抽象标记类型,那么Vehicle'Class必须在此Vehicles包中定义除了可以在类范围类型上调度的所有操作.
假设您不想添加基本操作:您没有编辑源文件的权限,或者您不希望使用不相关的功能来混淆包.
然后,您无法在其他包中定义隐式分派类型的操作Vehicle'Class.例如,你可能想序列车辆(定义一个Vehicles_XML与封装To_Xml调度功能)或显示它们作为UI元素(定义一个Vehicles_GTK与包Get_Label,Get_Icon...调度功能)等来执行动态调度的唯一方法是写代码明确; 例如,里面Vechicle_XML:
if V in Car'Class then
return Car_XML (Car (V));
else
if V in Bike'Class then
return Bike_XML (Bike (V));
else
raise Constraint_Error
with "Vehicle_XML is only defined for Car and Bike."
end if;
Run Code Online (Sandbox Code Playgroud)
(Vehicles当然,在其他地方定义并在其他地方使用的访问者模式也可以工作,但是仍然需要相同类型的显式调度代码.编辑实际上没有,但是仍然有一些样板代码要编写)
我的问题是:
是否有理由限制在T的定义包中定义在T上动态调度的操作?
这是故意的吗?这背后有一些历史原因吗?
谢谢
编辑:
感谢您当前的答案:基本上,它似乎是语言实现的问题(冻结规则/虚拟表).
我同意编译器会随着时间的推移逐步开发,并且并非所有功能都能很好地适应现有工具.因此,在一个独特的包中隔离调度操作符似乎是一个主要由现有实现而不是语言设计引导的决策.C++/Java系列之外的其他语言提供了没有这种要求的动态调度(例如OCaml,Lisp(CLOS);如果重要的话,那些也是编译 …
我对这种语言越来越熟悉了.但我有一个问题......我正在研究一个将温度转换为celcius或F的函数.我正在传递一个列表(50 C),然后分别处理每个案例.由于某种原因,当我这样做(等于"C"(cadr lst))我得到NIL.I打印出列表的干部,它是C.任何想法?
(defun convert-to-c(num)
(* (- num 32) 5/9)
)
(defun convert-to-f(num)
(+ (* num 9/5) 32)
)
(defun convert-temp (lst)
(cond ((equalp "C" (cadr lst)) (convert-to-f (car lst)))
(t (convert-to-c (car lst))))
)
Run Code Online (Sandbox Code Playgroud)
我正在打电话
(convert-temp '(30 C))
Run Code Online (Sandbox Code Playgroud) 我有相信Common Lisp中的语法问题.我有一个全局变量,*LOC*我可以设置它的初始值并进行更改.我的问题不在于变量,它工作正常,当我尝试显示带有其值的消息时.
例如,当我使用if语句并说出类似的内容时:
(if ( UPSTAIRSP *LOC*)
(progn (princ "I AM UPSTAIRS IN THE *LOC*"))
(progn (princ "I AM DOWNSTAIRS IN THE *LOC*"))
)
Run Code Online (Sandbox Code Playgroud)
我会得到:
I AM UPSTAIRS IN THE *LOC*
我很确定这是因为我的变量在引号中,但我不知道如何表达它.
假设我有一个清单:
((1 2 3) (8 4 7) (41 79 30) (0 8 5))
Run Code Online (Sandbox Code Playgroud)
我想做这个:
(1+8+41+0 2+4+79+8 3+7+30+5) = (50 93 45)
Run Code Online (Sandbox Code Playgroud)
我找到了一个丑陋的解决方案:
(defun nested+ (lst)
(let ((acc nil))
(dotimes (i (length (first lst)))
(push (apply #'+ (mapcar #'(lambda (a) (nth i a)) lst)) acc))
(reverse acc)))
Run Code Online (Sandbox Code Playgroud)
它似乎适用于我的目的,但我想这是缓慢而且没有lispy.什么是正确的方法?