小编Ant*_*oy'的帖子

Common Lisp:将给定哈希表的所有键作为列表

我想知道是否有比使用循环更简洁的方法.无论如何,这在CLISP中对我有用:

(loop for key being the hash-keys of *my-hash* collect key)
Run Code Online (Sandbox Code Playgroud)

我见过其他人使用maphash,但这涉及将每个密钥累积到一个列表中.除了比使用循环更多参与之外,它还引入了副作用,我尽可能避免这种副作用 - 我更喜欢函数式编程:)

是否有针对此常见任务预定义的内容,即使特定于实现?

(defun hash-keys (hash-table)
  (loop for key being the hash-keys of hash-table collect key))
Run Code Online (Sandbox Code Playgroud)

lisp hashtable key hashmap common-lisp

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

从Racket的功能中提前返回

如何在到达标准球拍中的最后一个表格之前从功能返回?这可以用于避免另一级别的缩进和形式嵌套.

在Common Lisp中有return,一种特殊形式的return-from.在Racket中有任何等价物,至少只能返回?

return function racket

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

Common Lisp:用于初始化具有许多条目的哈希表的简写

我正在寻找一种可能非冗长的可移植方式来初始化Common Lisp中的哈希表.例如,适用于常量哈希表的东西,也可用于预加载变量哈希.在CLISP我使用:

(defconstant +my-map+ #S(HASH-TABLE :TEST FASTHASH-EQ
  (key1 . "value1")
  ...
  (keyN . "valueN")
))
Run Code Online (Sandbox Code Playgroud)

但不幸的是这种格式只适用于CLISP.

initialization hashtable constants common-lisp

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

Common Lisp:获取ASDF包的版本

我知道我可以获得ASDF本身的版本号(asdf:asdf-version).但是同样的情况不适用于我使用ASDF加载的所有其他软件包,例如(my-system:my-system-version).是否有任何编程方式来获取:version系统定义中关键字的值?

(defsystem my-system
   ...
   :version "0.1"
   ...)
Run Code Online (Sandbox Code Playgroud)

我正在编写一个简单的HTTP服务器,并希望在Server HTTP头中包含版本号.无论如何,任何程序都需要能够在某处打印出用于获取用户信息的版本号.当然,我希望只在一个地方定义版本号,因为我可能忘记在多个地方更新它.

metadata version common-lisp asdf package

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

在Common Lisp中获取路径名的最后一个组件

虽然我可以建立一个路径名,例如

(make-pathname :directory '(:RELATIVE "dir" "subdir" "subsubdir"))
Run Code Online (Sandbox Code Playgroud)

我如何subsubdir从这样的路径名回来(假设它是一个目录)?我需要从路径名中提取最后一个dir,就像这个Unix命令一样:

$ basename /usr/local/share/
share
Run Code Online (Sandbox Code Playgroud)

directory common-lisp pathname

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

将使用wscanf读取的宽字符串转换为C中的整数

我试图将使用wscanf的字符串读取转换为使用wcstol的整数,两者都来自Linux上的头文件wchar.h.虽然wcstol在常量宽字符串(例如L"23")上工作,但它对wscanf输入无效,这让我很困惑.我总是得到0,即使输入实际上是数字(例如23).为什么?

$ ./test 
23
s=23
0
Run Code Online (Sandbox Code Playgroud)

这是我的测试程序:

#include <stdio.h>
#include <wchar.h>
int main() {
  wchar_t s[100];
  if (wscanf(L"%s", s) == 1) {
    wprintf(L"s=%s\n", s);
    wprintf(L"%ld\n", wcstol(s, NULL, 10));
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用strtol而不是wcstol,它可以工作,但我得到这个警告:

/usr/include/stdlib.h:183:17:注意:预期'const char*restrict'但参数类型为'wchar_t*{aka int*}'

我可以使用类型演员沉默.我认为wcstol是将宽字符串解析为整数的正确方法.因为我的机器上的字符实际上是整数,所以strtol恰好起作用,但这让我仍然不确定这是否是正确的解决方案.这里发生了什么?为什么wcstol没有做好自己的工作?

c string integer type-conversion

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