我想为第一个元素是特定类型(例如Function)的数组定义一个类型,其余元素是空类型.例如:
type FAs = [Function, {}, {}, {}, ...]; // pseudo code
Run Code Online (Sandbox Code Playgroud)
这样的事情可能吗?
目的是提供像这样的单参数函数:
const myCaller = ([fun, ...args]: FAs) => fun.apply(args);
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用两个参数myCaller
,如下所示:
const myCaller = (fun: Function, args: any[]) => fun.apply(args);
Run Code Online (Sandbox Code Playgroud)
但出于审美原因,我宁愿使用一个论点.我也想知道类型系统是否支持可以说是任意长度的元组.也许这样的事情对于我不理解的计算机科学原因是不可取的.
我看到的许多常用库使用单个packages.lisp
文件在一个地方声明库(系统)中的所有包.
由于导出的符号是包定义的一部分,因此这意味着单个源文件不会列出其导出的符号.
在我自己的项目中,我更喜欢每个包定义一个源文件的样式,并在文件顶部定义其接口/导出.
我想知道我是否做错了,或者错过了导致偏好单个packages.lisp文件的基本概念.
如果它是相关的,我也使用ASDF的:package-inferred-system
方法,而uiop:define-package
不是defpackage
,利用它的方便的符号阴影:mix
功能 - 因为我还没有弄清楚如何:use
一个阴影内置符号的包没有重新声明使用它的每个包中的阴影.
必要的用途eval-when
是确保宏编译和使用宏时所依赖的函数是可用的.但是,我想不出一个可以证明不使用后果的例子eval-when
.
(defpackage :eval-when
(:use :cl))
(in-package :eval-when)
(defun util-fun (x) (* x x))
(defmacro needs-help (x) `(let ((a (util-fun ,x))) a))
;; use it in the same file
(defun use-the-macro (x) (needs-help x))
(use-the-macro 5)
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,(defun util-fun ...)
应该用eval-when
.
编辑: 正如你在答案中看到的那样,这个例子有一个问题:它在编译时实际上并没有调用UTIL-FUN.这解释了为什么没有给出错误,因为它不是错误.但问题仍然有效,因为它突出了新用户的困惑.
但是,从REPL开始,在编译,加载或使用期间不会发出错误或警告(SBCL 1.3.20):
; SLIME 2.19
CL-USER> (uiop:getcwd)
#P"/home/anticrisis/dev/common-lisp/eval-when/"
CL-USER> (compile-file "eval-when.lisp")
; compiling file "/home/anticrisis/dev/common-lisp/eval-when/eval-when.lisp" (written 14 AUG 2017 11:30:49 AM):
; compiling (DEFPACKAGE :EVAL-WHEN ...)
; compiling (IN-PACKAGE :EVAL-WHEN)
; compiling …
Run Code Online (Sandbox Code Playgroud)