2016-04-11 26 views
0

かなり簡単な質問です。私の最初のアプローチは、最初の最後のlstの最後の要素を見つける別の手順を定義することでした。最後の要素を見つけた後、lst(car lst)の最初の要素を追加しました。 これは、どのように動作しますか? (1 2 3 2 1 5) たとえば、(append '(1 2 3)'(2 1 5)) - >(1 2 3 2 1 5) 問題が文法にすぎないのでしょうか?わからない。エラーがリストの最初と最後の要素を返します。

(append(car lst)(last lst))) 

":契約違反

期待

:?mpair与え

:MCAR 1" で発生し

(define (first-last lst) 
(define (last lst) 
    (cond ((null? (cdr lst))(car lst)) 
    (else (last (cdr lst))))) 
(append(car lst)(last lst))) 

これは、上の私の最初の質問ですスタックされているので、質問が正しい方法で提示されないとすみません。

答えて

1

appendは、の場合にのみ、の2つ以上のリストになります。ただし、既存のリストには参加していませんが、2つの要素からリストを作成しています。そのため、listを使用します。

(list (car lst) (last lst)) 
+0

ありがとうございます! – wooot

1

あなたがmatchを使用することができた場合は、きちんとした解決策が可能です。もちろん

(define first-last 
    (lambda (x) 
    (match x 
      ((first rest ... last) 
      (list first last)) 
      ((only) (list only only)) 
      (_ #f)))) 

、あなたはキャッチオール節で#f以外の何かを返すことができます。

+0

'match'は'#!racket'機能であり、 '#!r [56] rs'機能ではありません。エラーは 'mcar'を記述しているので、OPが使う'#!racket'ではありません。 – Sylwester

+0

私はAlex Shinn(guile)のラケット 'match'ではなく、ポータブルな' match'実装を使用しています。あなた自身が実装を推論できるかもしれませんが、質問自体は一般的なスキームであり、具体的な実装ではありません。 –

関連する問題