小编Rob*_*ert的帖子

Racket 和 Common Lisp 中顶级函数定义顺序的规则

我发现顶级声明顺序似乎并不重要。是否有关于该主题的任何文档?我不太明白。

显示函数可以在未定义的情况下被调用的示例

#lang racket

(define (function-defined-early)
  (function-defined-later))

(define (function-defined-later)
  1)

(function-defined-early)
> 1
Run Code Online (Sandbox Code Playgroud)
;; Common Lisp

(defun function-defined-early ()
  (function-defined-later))

(defun function-defined-later ()
  1)

(print (function-defined-early))
> 1
Run Code Online (Sandbox Code Playgroud)

lisp common-lisp racket

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

Common Lisp 符号相等

在互联网上的大多数示例中,符号相等性很简单:

(eq 'sym 'sym)
t
Run Code Online (Sandbox Code Playgroud)

在我的程序中,我想比较自定义包中的符号:

(defpackage #:my-package
  (:use    #:common-lisp)
  (:export #:my-function))

(in-package #:my-package)

(defun my-function (value)
  (cond
    ((eq value 'sym)
     (format t "SYM: YES~%"))
    (t
     (format t "SYM: NO~%"))))

(in-package #:common-lisp)

(my-package:my-function 'sym)
Run Code Online (Sandbox Code Playgroud)

但是当执行这段代码时,它显示:

SYM: NO
Run Code Online (Sandbox Code Playgroud)

这两个符号似乎不同:

(eq 'sym 'my-package::sym)
nil
Run Code Online (Sandbox Code Playgroud)

原因似乎很容易理解,在给定包中驻留的符号不等于在另一个包中驻留的同名符号。很公平!但是无论包如何,比较 2 个符号的习惯用法是什么?

我们应该首先将其转换为字符串并比较字符串吗?

(defpackage #:my-package
  (:use    #:common-lisp)
  (:export #:my-function))

(in-package #:my-package)

(defun my-function (value)
  (cond
    ((string= (symbol-name value) "SYM")
     (format t "SYM: YES~%"))
    (t
     (format t "SYM: NO~%"))))

(in-package #:common-lisp)

(my-package:my-function 'sym)
Run Code Online (Sandbox Code Playgroud)

结果更好,但是关于字符大小写有一个明显的问题。

如何检查 2 个符号是否相同,无论其封装如何?

lisp common-lisp

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

标签 统计

common-lisp ×2

lisp ×2

racket ×1