小编cor*_*ump的帖子

如何让Emacs/Slime/SBCL识别quicklisp包

我想让Emacs,SLIME和quicklisp正常合作.我有以下环境设置:

  • 安装了Emacs
  • 在Emacs中安装了SLIME
  • 已安装SBCL
  • 安装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.

我错过了什么让这些作品正确地协同工作?

sbcl common-lisp asdf slime quicklisp

2
推荐指数
2
解决办法
1192
查看次数

宏扩展后的未定义函数

我正在学习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: …

macros common-lisp cl-who

2
推荐指数
1
解决办法
366
查看次数

Scheme默认对象的Common Lisp等价物是什么?

我正在将一些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?

scheme common-lisp

2
推荐指数
1
解决办法
96
查看次数

Lisp - Flag(bandera) 不起作用

我正在尝试编写一个函数来确定一个单词是否是回文。我做了这个,但它总是返回“不是回文”。我不知道发生了什么。

(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)

我怎样才能解决这个问题?

loops clisp common-lisp palindrome conditional-statements

2
推荐指数
1
解决办法
173
查看次数

以dotimes为单位的多个返回值

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)- > 21,如何dotimes知道只使用第一个值而忽略第二个值的计数形式?

common-lisp multiple-value floor

2
推荐指数
2
解决办法
98
查看次数

试图计算总工资

我正在尝试创建一个程序来计算每周员工的总工资。

这是我的代码

(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)

lisp clisp common-lisp

2
推荐指数
1
解决办法
89
查看次数

Ada封装动态调度操作(原语)背后的基本原理

在Ada中,类型T的原始操作只能在定义了T的包中定义.例如,如果Vehicules包定义CarBike标记了记录,两者都继承了一个通用的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);如果重要的话,那些也是编译 …

ada dynamic-dispatch

1
推荐指数
1
解决办法
405
查看次数

Lisp等于没有按预期工作

我对这种语言越来越熟悉了.但我有一个问题......我正在研究一个将温度转换为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)

lisp

1
推荐指数
1
解决办法
55
查看次数

显示消息中全局变量的值

我有相信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*

我很确定这是因为我的变量在引号中,但我不知道如何表达它.

lisp common-lisp

1
推荐指数
1
解决办法
219
查看次数

Lisp:添加列表列表的各个元素

假设我有一个清单:

((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.什么是正确的方法?

lisp nested common-lisp

1
推荐指数
2
解决办法
312
查看次数