簡體   English   中英

我如何在常見的lisp中格式化alist?

[英]How might I format an alist in common lisp?

我開始給我寫一些Common Lisp,我只是把事情放在一起並格式化它們。

讓我們假設我有一個alist,就像這樣:

(defvar *map* '((0 . "zero") (1 . "one") (2 . "two")))

我該如何格式化呢?

0: zero
1: one
2: two

我想的是(format t "~{~{~a: ~a~}~%~}" *map*) ,但這會產生錯誤,因為“零”不是列表而你不能拿它的車。

當然,打印(format t "~{~a~%~}" *map*)

(0 . "zero")
(1 . "one")
(2 . "two")

喜歡它應該,但它不是我想要的。 有沒有更好的方法來做到這一點而不僅僅是(dolist (entry *mapping*) (format t "~a: ~a~%" (car entry) (cdr entry)))

Freenode上的#cl-gardeners頻道建議像這樣做一個解構循環綁定:

(loop for (a . b) in *mapping*
  do (format t "~a: ~a" a b))

你是對的,因為看起來沒有辦法從FORMAT中分離出一個缺點。

如果您定義另一個函數來格式化單個關聯:

(defun print-assoc (stream arg colonp atsignp)
  (format stream "~A: ~A" (car arg) (cdr arg)))

那很簡單:

(format t "~{~/print-assoc/~%~}" *map*)

我不確定這是否有所改善。 一方面,它有點復雜,但另一方面,它確實將print-assoc分解為(可重用)函數,這可能很有用。

我認為這里的外賣課程實際上不是為你的列表使用虛線列表。 當然,你可以保存一個cons單元格,但是你放棄了所有好的序列和列表函數。 這不值得。 您的格式化示例完全形成列表是微不足道的:

(defvar *map* '((0 "zero") (1 "one") (2 "two")))
(format t "~:{~a: ~a~}" *map*)

我不認為有更好的方法來做到這一點; 我會用map()

(format t "~{~a~%~}"
  (map 'list
    #'(lambda (entry)
      (format nil "~a: ~a" (car entry) (cdr entry))
    *map*))

使用將alist單元格(a . 2) a.2)轉換為list (a 2)

(mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*)

然后以格式處理。

例如,將((a . 2) (b . 3))打印為"a=2&b=3"

使用

(format t "~{~{~a~^=~}~^&~}" (mapcar #'(lambda (x) `(,(car x) ,(cdr x))) *map*))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM