我想知道是否有比使用循环更简洁的方法.无论如何,这在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) 如何在到达标准球拍中的最后一个表格之前从功能返回?这可以用于避免另一级别的缩进和形式嵌套.
在Common Lisp中有return,一种特殊形式的return-from.在Racket中有任何等价物,至少只能返回?
我正在寻找一种可能非冗长的可移植方式来初始化Common Lisp中的哈希表.例如,适用于常量哈希表的东西,也可用于预加载变量哈希.在CLISP我使用:
(defconstant +my-map+ #S(HASH-TABLE :TEST FASTHASH-EQ
(key1 . "value1")
...
(keyN . "valueN")
))
Run Code Online (Sandbox Code Playgroud)
但不幸的是这种格式只适用于CLISP.
我知道我可以获得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头中包含版本号.无论如何,任何程序都需要能够在某处打印出用于获取用户信息的版本号.当然,我希望只在一个地方定义版本号,因为我可能忘记在多个地方更新它.
虽然我可以建立一个路径名,例如
(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) 我试图将使用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没有做好自己的工作?