Index: lang/c/misc/mlisp/src/ml_builtin.c
===================================================================
--- lang/c/misc/mlisp/src/ml_builtin.c (revision 5814)
+++ lang/c/misc/mlisp/src/ml_builtin.c (revision 5924)
@@ -40,5 +40,5 @@
 }
 
-
+/// �o�b�N�N�H�[�g�̏���
 static SExp b_quasiquote_sub(MLContext* ml, SExp a)
 {
@@ -46,13 +46,33 @@
 		return a;
 	} else {
-		SExp unq = ml_make_symbol(ml, "unquote", NULL);
-		SExp ca = ml_car(ml, a);
-		if (ca == unq) {
-			return ml_eval(ml, ml_car(ml, ml_cdr(ml, a)));
-		} else {
-			SExp ls;
-			SExp top = cNil, tail = cNil;
-			for (ls = a; ls != cNil; ls = ml_cdr(ml, ls)) {
-				SExp b = b_quasiquote_sub(ml, ml_car(ml, ls));
+		SExp ls;
+		SExp top = cNil, tail = cNil;
+		for (ls = a; ls != cNil; ls = ml_cdr(ml, ls)) {
+			SExp ca = ml_car(ml, ls);
+			SExp b;
+			if (SEXP_CONSP(ca)) {
+				SExp unq = ml_make_symbol(ml, "unquote", NULL);
+				SExp unqa = ml_make_symbol(ml, "unquote-splicing", NULL);
+				SExp caa = ml_car(ml, ca);
+				if (caa == unq) {
+					b = ml_eval(ml, ml_car(ml, ml_cdr(ml, ca)));
+				} else if (caa == unqa) {
+					b = ml_eval(ml, ml_car(ml, ml_cdr(ml, ca)));
+					ml_rplacd(ml, tail, b);
+					if (SEXP_IS_ATOM(b)) {
+						break;
+					} else {
+						SExp cd;
+						for (tail = b; (cd = ml_cdr(ml, tail)) != cNil; tail = cd);
+						continue;
+					}
+				} else {
+					b = b_quasiquote_sub(ml, ml_car(ml, ls));
+				}
+			} else {
+				b = b_quasiquote_sub(ml, ml_car(ml, ls));
+			}
+
+			{
 				SExp cd = ml_cons(ml, b, cNil);
 				if (top == cNil) {
@@ -63,6 +83,6 @@
 				tail = cd;
 			}
-			return top;
-		}
+		}
+		return top;
 	}
 }
@@ -72,5 +92,4 @@
 {
 	SExp ca = ml_car(ml, a);
-	// �T�u�c���[��ǂ�āA unquote �ȊO��ote ��
 	return b_quasiquote_sub(ml, ca);
 }
Index: lang/c/misc/mlisp/src/mlisp.cpp
===================================================================
--- lang/c/misc/mlisp/src/mlisp.cpp (revision 5814)
+++ lang/c/misc/mlisp/src/mlisp.cpp (revision 5924)
@@ -608,5 +608,5 @@
 		{
 			SExp a = read_list(fp);
-	
+
 			// close paren
 			int c = fgetc(fp);
@@ -615,5 +615,5 @@
 				syntax_error(ERR_NO_CLOSE_PAREN);
 			}
-	
+
 			return a;
 		}
@@ -630,6 +630,14 @@
 	case ',':
 		{
+			SExp fn;
+			c = fgetc(fp);
+			if (c != '@') {
+				ungetc(c, fp);
+				fn = make_symbol("unquote", NULL);
+			} else {
+				fn = make_symbol("unquote-splicing", NULL);
+			}
 			SExp a = read_rec(fp);
-			return cons(make_symbol("unquote", NULL), cons(a, cNil));
+			return cons(fn, cons(a, cNil));
 		}
 	case '"':
Index: lang/c/misc/mlisp/readme.txt
===================================================================
--- lang/c/misc/mlisp/readme.txt (revision 5814)
+++ lang/c/misc/mlisp/readme.txt (revision 5924)
@@ -51,7 +51,5 @@
 * todo
 
-- �����Ƃ��������� �}�N�����Łu`�v�u,�v�u,@�v���������
--- �u`�v�u,�v����ς�
-- ���L�V�J���X�R�[�v�A�N���[�W��
+- �����Ƃ��������� ���L�V�J���X�R�[�v�A�N���[�W��
 - �K�x�R��
 - assert �Ŏ��ȂȂ��悤��
@@ -63,4 +61,8 @@
 - destructuring-bind
 - &optional, &rest
+
+-[v] �}�N�����Łu`�v�u,�v�u,@�v���������
+-- �u`�v�u,�v����ς�
+-- �u,@�v����ς�
 
 
