小编Eli*_*son的帖子

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

调用函数和宏内部宏之间的区别?

我的谜题是以下示例:

(defmacro macro1 [x]
  (println x))

(defn func1 [x]
  (println x))

(defmacro macro2 [x]
  `(macro1 ~x)
  (func1 x))

(defmacro macro3 [x]
  (func1 x)
  `(macro1 ~x))

(println "macro2")
(macro2 hello)

(println "macro3")
(macro3 hello)
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,输出是:

macro2
hello
macro3
hello
hello
Run Code Online (Sandbox Code Playgroud)

为什么macro2和macro3的输出不同?根据我的理解,宏内部宏的所有调用都可以用函数代替(除了重用的原因).我的理解有什么不对吗?


谢谢迈克尔的澄清.我的一般问题是如何在宏内部使用函数或宏来操作s-expression.我想知道它们是否可以交换使用,除了它们在不同的阶段被唤醒.另一个例子:

(defn manipulate-func [x]
  (list + x 1))

(defmacro manipulate-macro [x]
  (list + x 1))

(defmacro macro1 [x y]
  [(manipulate-func x) `(manipulate-macro ~y)])

(println (clojure.walk/macroexpand-all '(macro1 (+ 1 2) (+ 3 4))))
;; [(#<core$_PLUS_ clojure.core$_PLUS_@332b9f79> (+ 1 2) 1) (#<core$_PLUS_ …
Run Code Online (Sandbox Code Playgroud)

macros clojure

5
推荐指数
2
解决办法
2492
查看次数

如何使用 Freetype、Harfbuzz 和 Fontconfig 执行字形替换

我目前正在使用 Freetype、Harfbuzz 和 Fontconfig在McCLIM中实现字体渲染。只要我选择正确的字体,我就可以使用这些库很好地渲染文本。

我现在的主要问题是如何处理丢失的字形。如果我使用 Source Code Pro 渲染某些内容,并且文本包含此字体中不存在的符号(例如希腊字符),我想选择不同字体的字符。

这应该怎么做呢?据我所知,没有办法轻松找到具有给定字形的字体,即使我确实搜索了所有字体,我如何选择最合适的字体?

我找不到任何文档来解释如何有效地执行此操作的过程,并且我一直使用的文档的主要来源 libXft 没有实现字体替换。

fonts freetype2 fontconfig harfbuzz

5
推荐指数
0
解决办法
701
查看次数

Common Lisp中的高阶函数语法

我正在使用Norvig的人工智能编程范式教自己Common Lisp,并且遇到了一些我不理解的东西,他没有解释.

(defun mappend (fn the-list)
  (apply #'append (mapcar fn the-list)))
Run Code Online (Sandbox Code Playgroud)

如下调用高阶函数higherOrderFunc #'funcName funcArg和在mapcar没有调用时执行的操作有什么区别#'?是#'调用高阶函数时,有必要吗?

lisp common-lisp

4
推荐指数
2
解决办法
2296
查看次数

Lisp中的Quicksort奇怪的行为?

我设法让我的快速排序功能工作,但我很困惑为什么稍微更改代码导致函数表现奇怪.这是工作代码:

(defun low (mylist)
  (setq result (list))
  (loop
      for x in mylist
      do (if (< x (car mylist))
             (setq result (cons x result))))
  result)

(defun high (mylist)
  (setq result (list))
  (loop
      for x in mylist
      do (if (> x (car mylist))
             (setq result (cons x result))))
  result)

(defun qsort (mylist)
  (if (null mylist)
       nil
       (progn 
         ;(setq l1 (low mylist))
         ;(setq l2 (high mylist))
         (append (qsort (low mylist))
                 (list (car mylist))
                 (qsort (high mylist))))))
Run Code Online (Sandbox Code Playgroud)

然而,在qsort功能,如果我尝试存储在分区l1l2,然后调用 …

lisp common-lisp quicksort

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

#'相等比较真实比较(列表7 1)但是与'(7 1)比较时为假,为什么?

SBCL 1.3.1

总之,a是一个列表,'(7),b设置为通过相同的列表setq.附加一个值b.列表c设置为追加后的预期结果,即'(7 1).a然后进行比较c并正确比较真实.但是,当a比较via时(equal a '(7 1)),它会比较false.

我的猜测是编译器没有看到追加,就像它已经完成一样b,并且已经将比较优化为常量并且结果不正确.如果是这样,有哪些选项可以提示编译器.可以a某种方式标记为特殊?或者,除了与破坏性编程相关的样式问题之外,还有其他什么东西在这里发生吗?

    (defun test-0 ()
      (let ((a '(7))
            b
            (c '(7 1)))
        (setq b a)
        (setf (cdr b) (cons 1 '()))
        (pprint (list a b c))

        (values (equal c a) (equal '(7 1) a) (equal (list 7 1) a) c a)))


    * (test-0)

    ((7 1) (7 1) (7 …
Run Code Online (Sandbox Code Playgroud)

sbcl common-lisp

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

Lisp:遇到条件问题

嘿伙计们,我刚刚开始在我的大学里学习Lisp,但教授非常贫穷,而且自己似乎不懂语言,所以我转向你们所有人.我在Java方面非常有经验,并且在将Java的条件与Lisp相关时遇到了麻烦.这是我被要求解决的问题.

"写一个函数,它接受乘客和两个城市之间的机票量的年龄.如果孩子小于两个机票为0,二至五它是全票价的60%.如果孩子为五他们全程票价."

这是我的解决方案,但我认为这是低效的.

(defun young-child(x y)
        (cond
          ((< x 2) 0)
          ((= x 2) (* y .6))
          ((= x 3) (* y .6))
          ((= x 4) (* y .6))
          ((= x 5) (* y .6))
          ((> x 5) y)))
Run Code Online (Sandbox Code Playgroud)

现在用Java,我就是这样说的

if (x >= 2 && x =< 5) {
  return y*.6
}
else if (x < 2) {
  return 0;
}
else {
  return y;
}
Run Code Online (Sandbox Code Playgroud)

我要问的是:有没有更好的方法来编写这个Lisp条件?如果我必须检查更大范围的年龄,那么使用这种方法代码将变得非常乏味.有没有一种方法可以在Lisp中检查一个if语句中的2个条件,就像我在Java中所做的那样?非常感谢您查看此代码以及任何未来的响应!

common-lisp

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

为什么lambda返回一个全局变量而不是局部变量?

测试#1

我有一个全局声明的变量f,以及一个名为的参数的函数f:

(defvar f 1)

(defun test (f)
    f)
Run Code Online (Sandbox Code Playgroud)

我调用该函数,它返回参数的值:

(test 2)
=> 2
Run Code Online (Sandbox Code Playgroud)

测试#2

我再次有一个全局声明的变量f,以及一个名为参数的函数f.但是,这次函数返回a lambda,返回f:

(defvar f 1)

(defun test (f)
     #'(lambda ()
         f))
Run Code Online (Sandbox Code Playgroud)

我调用该函数并返回该lambda函数.然后我调用lambda函数,它返回全局值f:

(funcall (test 2))
=> 1
Run Code Online (Sandbox Code Playgroud)

我很惊讶.我认为该lambda函数是一个闭包,并将返回本地f,而不是全局f.如何修改test函数和/或lambda函数以使lambda函数返回本地函数而f不是全局函数f

将讨论指向讨论此特定范围问题的在线资源的指针.

common-lisp

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

比较lisp中的数字和列表对象

我是lisp的新手,所以如果我提前说这是一个简单的问题,我道歉.

我有一个清单:

(set ‘inventory ‘(parts
                   ((item 1001) (shoes (color brown) (size 10) (cost 20))) 
                   ((item 2011) (skirt (color blue) (size 4) (cost 10)))
                   ((item 2120) (pants (color white) (size 32) (cost 30)))
                   ((item 2121) (pants (color brown) (size 34) (cost 30)))))
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个按项目编号查看列表的函数,并返回正确的函数.

(findItem 1001 inventory) 应该返回:

((item 1001) (shoes (color brown) (size 10) (cost 20)))
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

(defun findItem (q i)   
    (cond
        ((null q)
         nil)
        ((null (cdr i))
         nil)
        ((eq `parts (car i))
         (findItem q (cdr i)))
        ((eq q (cdr (car …
Run Code Online (Sandbox Code Playgroud)

lisp

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

将文件输入流中的列表存储在LISP中的变量中

我可以在.txt文件中说出以下列表

(5 3 1)

我正在尝试使用以下源代码,将上面的列表存储在LISP中的变量中.在第一种格式之前,一切似乎都是对 但后来我意识到这*originalStateVar*不是被视为具有3个原子的列表,而是作为具有1个原子的列表.源代码如下:

(defvar *originalStateVar*)
(defun fileInput ()
  (let ((i 1)(in (open *originalStateLocation* :if-does-not-exist nil)))
        (when in
            (loop
                for line = (read-line in nil)
                while line do 
                    (format t "~a~%" line)                ;debug line
                    (format t "i is <~a>~%" i)            ;debug line
                    (setf *originalStateVar* (list line)) ;storing list in variable
                    (setf i (+ i 1)))                     ;debug line
            (close in))
        (format t "originalStateVar is <~a>" (car *originalStateVar*))
        (format t "second element originalStateVar is <~a>~%" (cadr *originalStateVar*))
        (format …
Run Code Online (Sandbox Code Playgroud)

lisp common-lisp

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