小编ant*_*sis的帖子

在Typescript中,为数组定义一个类型,其中第一个元素比其余元素更具体

我想为第一个元素是特定类型(例如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)

但出于审美原因,我宁愿使用一个论点.我也想知道类型系统是否支持可以说是任意长度的元组.也许这样的事情对于我不理解的计算机科学原因是不可取的.

types typescript

19
推荐指数
3
解决办法
4008
查看次数

为什么许多Common Lisp系统使用单个packages.lisp文件?

我看到的许多常用库使用单个packages.lisp文件在一个地方声明库(系统)中的所有包.

由于导出的符号是包定义的一部分,因此这意味着单个源文件不会列出其导出的符号.

在我自己的项目中,我更喜欢每个包定义一个源文件的样式,并在文件顶部定义其接口/导出.

我想知道我是否做错了,或者错过了导致偏好单个packages.lisp文件的基本概念.

如果它是相关的,我也使用ASDF的:package-inferred-system方法,而uiop:define-package不是defpackage,利用它的方便的符号阴影:mix功能 - 因为我还没有弄清楚如何:use一个阴影内置符号的包没有重新声明使用它的每个包中的阴影.

common-lisp

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

在Common Lisp中,什么时候需要使用eval-when,你怎么知道?

必要的用途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)

common-lisp compile-time eval-when

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

标签 统计

common-lisp ×2

compile-time ×1

eval-when ×1

types ×1

typescript ×1