小编Rog*_*llo的帖子

为什么基数约束在运行命令中起作用但在事实上不起作用?

下面是两个桌面的Alloy表示.在fact我指定第一个桌面包含两个图标,A和B,第二个桌面包含一个图标,A.我想指定正好有两个桌面,所以我把它放在以下事实中:

#Desktop = 2
Run Code Online (Sandbox Code Playgroud)

当我完成run命令时,我收到了这条消息:No instance found.当我从而省略fact了该run命令并指定了命令中的桌面数量时:

run {} but 2 Desktop
Run Code Online (Sandbox Code Playgroud)

然后生成所需的实例.为什么?当我限制桌面数量时,为什么它不起作用fact,但是当我限制run命令中的桌面数量时它是否有效?

open util/ordering[Desktop]

sig Desktop {
     icons: set Icon
} 

abstract sig Icon {}
one sig A extends Icon {}
one sig B extends Icon {}

fact {
    first.icons = A + B
    first.next.icons = A
}
Run Code Online (Sandbox Code Playgroud)

alloy

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

如何创建返回函数的Haskell函数?

我想创建三个Haskell函数:a,b,和c.

每个函数都有一个参数.这个论点是三个函数之一.

我想函数a有这种行为:

  • 如果参数是函数,a则返回函数a.
  • 如果参数是函数b,则返回函数b.
  • 如果参数是函数c,则返回函数a.

这里是我想要的功能回顾a:

a a = a
a b = c
a c = a 
Run Code Online (Sandbox Code Playgroud)

这是我希望其他两个功能的行为:

b a = a
b b = a
b c = c

c a = c
c b = b
c c = c
Run Code Online (Sandbox Code Playgroud)

一旦创建,我希望能够以各种方式组合函数,例如:

  a (c b)
= a (b)
= c
Run Code Online (Sandbox Code Playgroud)

我该如何创建这些功能?

haskell functional-programming function function-composition higher-order-functions

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

如何使用嵌入字符串标记字符串?

我正在学习如何使用名为Alex 1的Haskell词法分析器工具.

我正在尝试为此字符串实现词法分析器(电子邮件"From:"标题):

From: "John Doe" <john@doe.org>
Run Code Online (Sandbox Code Playgroud)

我想把它分解成这个令牌列表:

[
  From,
  DisplayName "John Doe",
  Email,
  LocalName "john",
  Domain "doe.org"
]
Run Code Online (Sandbox Code Playgroud)

以下是我的实施.如果字符串不包含显示名称,它可以正常工作.也就是说,这很好用:

let s = "From: <john@doe.org>"
alexScanTokens s
Run Code Online (Sandbox Code Playgroud)

但是,当我包含显示名称时,我收到以下错误消息:

[From*** Exception: lexical error
Run Code Online (Sandbox Code Playgroud)

也就是说,这会导致错误:

let s = "From: \"John Doe\" <john@doe.org>"
alexScanTokens s
Run Code Online (Sandbox Code Playgroud)

我猜我的Alex程序的这部分导致错误:

\"[a-zA-Z ]+\"      { \s -> DisplayName (init (tail s)) }
Run Code Online (Sandbox Code Playgroud)

Alex左侧是一个正则表达式:

\"[a-zA-Z ]+\"
Run Code Online (Sandbox Code Playgroud)

右侧是找到与正则表达式匹配的字符串时要采取的操作:

{ \s -> DisplayName (init (tail s)) }
Run Code Online (Sandbox Code Playgroud)

关于问题可能是什么的任何想法?

这是我的词法分析器程序:

{
module Main (main) where
}

%wrapper …
Run Code Online (Sandbox Code Playgroud)

regex haskell lexical-analysis alex

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

Common Lisp:无法将文件加载到Lisp解释器中

Lisp新手在这里.

我创建了一个函数并将其放入此文件中:compress.lisp

现在我想将它加载到我正在使用的Lisp解释器中,GCL-2.6.2-ANSI

这是我在解释器中输入的内容:

(load "compress.lisp")
Run Code Online (Sandbox Code Playgroud)

解释器响应此错误:

Error in EVAL [or a callee]: Cannot open the file compress.lisp.

Fast links are on: do (use-fast-links nil) for debugging
Broken at CONDITIONS::CLCS-LOAD.  Type :H for Help.
 1 (Continue) Retry loading file "compress.lisp".
 2 (Abort) Return to top level.
dbl:>>
Run Code Online (Sandbox Code Playgroud)

是否正在加载GCL-2.6.2-ANSI不允许的文件?或者(更有可能)我做错了什么; 如果是的话,什么?

lisp common-lisp

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

Common Lisp:在Paul Graham的书中无法获得解压缩功能

Lisp新手在这里.

我正在阅读Paul Graham的书,ANSI Common Lisp.

第38页是一个uncompress功能.它需要一对对列表,其中对中的第一项是一个数字,表示应该有多少第二项.例如,解压缩:

((3 a) (2 b) c)
Run Code Online (Sandbox Code Playgroud)

应该产生这个:

(A A A B B C)
Run Code Online (Sandbox Code Playgroud)

我将uncompress函数输入到Lisp解释器(GCL-2.6.2-ANSI)中,然后像这样测试它:

(uncompress '((3 A) B (2 C) (5 D)))
Run Code Online (Sandbox Code Playgroud)

这产生了以下错误消息:

Error in IF [or a callee]: Too many arguments.

Fast links are on: do (use-fast-links nil) for debugging
Broken at IF.  Type :H for Help.
 1 (Abort) Return to top level.
Run Code Online (Sandbox Code Playgroud)

以下是uncompress功能.我认为我忠实地输入了书中所写的内容.我测试了每一件,每件都看似正常.说实话,我被困住了.我不知道是什么导致了这个错误.我很感激你的帮助.

(defun uncompress (lst)
   (if (null lst)
       nil
       (let (elt (car lst))
            (rest (uncompress (cdr …
Run Code Online (Sandbox Code Playgroud)

lisp common-lisp

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

Common Lisp:一个判断列表是否包含嵌套列表的谓词?

如果列表有子列表,我需要一个返回true的谓词,否则返回false.

我写了一个实现它的函数(如下).我想知道这样的谓词是否已经存在?

(defun hasSublistp (lst)
    (cond ((null lst) nil)
          ((listp (first lst)) t)
          (t (hasSublistp (rest lst)))))
Run Code Online (Sandbox Code Playgroud)

lisp common-lisp

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

Common Lisp:如何显示一个点?

我想用点(.)作为符号,像ab.

我发现我可以通过引用和转义点来实现.但是,当点显示在屏幕上时,它被垂直条包围:

'\.
=> |.|
Run Code Online (Sandbox Code Playgroud)

如何在没有垂直条的情况下显示点?

更新:谢谢你jkiiski,使用的format工作很棒.这就是我这样做的原因:对于我自己的教育,我编写了一个函数,将列表表示法中的列表转换为点表示法中的等效列表.感谢您的帮助,现在效果很好:

(defun list-notation-to-dot-notation (lst)
    (cond ((atom lst) lst)
          ((null (cdr lst)) (list (list-notation-to-dot-notation (car lst)) '\. 'NIL))
          (t (list (list-notation-to-dot-notation (car lst)) '\. (list-notation-to-dot-notation (cdr lst))))))

(defun list-2-dot (lst)
    (format t "~a" (list-notation-to-dot-notation lst)))

(list-2-dot '(a))
=> (A . NIL)

(list-2-dot '(a b))
=> (A . (B . NIL))

(list-2-dot '((a) b))
=> ((A . NIL) . (B . NIL))

(list-2-dot '(a (b) c))
=> (A . ((B …
Run Code Online (Sandbox Code Playgroud)

common-lisp

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

Common Lisp函数,它打开列表以显示列表中的元素序列?

我想将该union函数应用于列表中的列表.例如:

适用union于此列表中的列表:'((a b c) (a d))

是否有一个"展开"列表的函数,以显示列表中的元素序列?例如:

展开此列表'((a b c) (a d))会生成此序列'(a b c) '(a d)

如果我能做到这一点,那么我可以将该union函数应用于序列.

获取union列表中包含的列表序列的推荐习惯是什么?

lisp common-lisp

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

如何将一个返回闭包的Scheme函数转换为等效的Common Lisp函数?

我正在将一些Scheme代码转换为Common Lisp.我不知道Scheme.我知道一点Common Lisp.

我想我理解这个Scheme代码:

(define (make-cell)
    (let ((local-name '()))
       (define (local-add-name name)
           (set! local-name name))
        (define (me message)
            (cond ((eq? message 'add-name) local-add-name)
                  ((eq? message 'name) local-name)))
     me))
Run Code Online (Sandbox Code Playgroud)

使用该功能,我可以制作两个单元格:

(define a (make-cell))
(define b (make-cell))
Run Code Online (Sandbox Code Playgroud)

然后我可以在每个单元格中存储一个名称:

((a 'add-name) 'a)
((b 'add-name) 'b)
Run Code Online (Sandbox Code Playgroud)

然后我可以检索存储在每个单元格中的名称:

(a 'name)
Run Code Online (Sandbox Code Playgroud)

=> a

(b 'name)
Run Code Online (Sandbox Code Playgroud)

=> b

a-cell在其中存储了名称"a".b-cell在其中存储了名称"b".我可以查询a-cell的名称,然后返回"a".我可以查询b-cell的名称,然后返回"b".

到目前为止,我是否正确理解?

现在我想使用Common Lisp实现相同的功能.这是我创建的make-cell函数:

(defun make-cell ()
    (let ((local-name nil))
        (defun local-add-name (name)
            (setf local-name name))
        (defun me (message)
            (cond ((eq message 'add-name) #'local-add-name)
                  ((eq message 'name) local-name)))))
Run Code Online (Sandbox Code Playgroud)

显然这是错误的,因为它没有给出所需的行为,正如我接下来所示. …

scheme common-lisp

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

如何解释 dBase (.dbf) 文件中的语言驱动程序名称?

我在十六进制编辑器中打开了 dBase (.dbf) 文件。见下文。我圈出了包含“语言驱动程序名称”的字段。我如何解释该字段?该字段是字符串吗?如果它是一个字符串,那么为什么它包含一堆空(十六进制 0)字符?

dBase 语言驱动程序名称

dbase

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