Построить список из числа и номера или списка и номера в схеме - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь создать список, добавив номер в существующий список. Проблема в том, что существующий список не обязательно является списком. Это может быть либо пустой список ((list )), либо просто число, либо фактический список.

В основном мне нужно что-то вроде append, но оно должно уметь обрабатывать этот случай:

(append 1 2) и создайте список (list 1 2)

В дополнение к типичному случаю:

(append (list 1 2) 3)

Использование добавления для первого случая выдает ошибку append: expected argument of type <proper list>; given 1

Есть ли что-то вроде append, которое может справиться с обоими этими случаями? Или есть другой способ сделать это?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 24 ноября 2011
Welcome to Racket v5.1.1.
-> ;; First, you gave this example
(append (list 1 2) 3)
'(1 2 . 3)
-> ;; but notice that's not a proper list
(list? '(1 2 . 3))
#f
-> ;; you probably meant
(append (list 1 2) (list 3))
'(1 2 3)
-> ;; which is a list
(list? '(1 2 3))
#t
-> ;; I would make something like Sam's function
;; but it converts anything to a list
(define (any->list x)
  (cond
   [(list? x) x]
   [else (list x)]))
-> ;; So for example:
(any->list 1)
'(1)
-> (any->list (list 1))
'(1)
-> ;; and then you use that in a variation of append
(define (my-append a b)
  (append (any->list a) (any->list b)))
-> ;; so you can do any of these:
(my-append 1 2)
'(1 2)
-> (my-append '(1) 2)
'(1 2)
-> (my-append 1 '(2))
'(1 2)
-> (my-append '(1) '(2))
'(1 2)
-> 
2 голосов
/ 23 ноября 2011

Попробуйте эту простую программу и скажите, решит ли она вашу проблему:

#lang racket
(define (apnd a b)
   (flatten (cons a b)) 
)

#test
(apnd 1 2)
(apnd (list 1 2) (list 3 4))
(apnd '() 1)
(apnd 1 '())
(apnd '() '())
(apnd (list 1 2) 3)
(apnd 1 (list 2 3))

Рекомендации: Свести

2 голосов
/ 23 ноября 2011

Вот довольно простое решение, следуя рецепту от Как разрабатывать программы .

;; An Input is one of
;; - Number
;; - Listof[Number]

;; to-list : Input -> Listof[Number]
;; convert the input to a list if necessary
(define (to-list v)
  (cond [(number? v) (list v)]
        [else v]))

;; append* : Input Input -> Listof[Number]
;; append two inputs, converting to lists first if necessary
(define (append* a b)
  (append (to-list a) (to-list b)))
0 голосов
/ 23 ноября 2011

Я бы написал функцию для этого.

Редактировать: Как сказал другой человек, это похоже на домашнюю работу.По сути, вы хотите использовать условное выражение в функции, чтобы проверить, является ли оно списком, и действовать соответственно.

...