diff --git a/egison.cabal b/egison.cabal
--- a/egison.cabal
+++ b/egison.cabal
@@ -1,5 +1,5 @@
 Name:                egison
-Version:             3.6.2
+Version:             3.6.3
 Synopsis:            Programming language with non-linear pattern-matching against non-free data
 Description:
   An interpreter for Egison, a **pattern-matching-oriented**, purely functional programming language.
diff --git a/hs-src/Language/Egison/Core.hs b/hs-src/Language/Egison/Core.hs
--- a/hs-src/Language/Egison/Core.hs
+++ b/hs-src/Language/Egison/Core.hs
@@ -255,6 +255,14 @@
       _ -> throwError $ TypeMismatch "integer or string" $ Value val
   makeHashKey whnf = throwError $ TypeMismatch "integer or string" $ whnf
 
+evalExpr env (UserIndexedExpr expr indices) = do
+  val <- evalExprDeep env expr
+  js <- mapM (\i -> case i of
+                      Userscript n -> evalExprDeep env n >>= return . Userscript) indices
+  case val of
+    (UserIndexedData val' is') -> return $ Value $ UserIndexedData val' (is' ++ js)
+    _ -> return $ Value $ UserIndexedData val js
+
 evalExpr env (IndexedExpr expr indices) = do
   tensor <- case expr of
               (VarExpr var) -> do
@@ -712,6 +720,10 @@
   mExprs <- mapM extractScalar args
   return (Value (ScalarData (Div (Plus [(Term 1 [(Apply fn mExprs, 1)])]) (Plus [(Term 1 [])]))))
 applyFunc _ (Value fn@(ScalarData (Div (Plus [(Term 1 [(Symbol _ _ _, 1)])]) (Plus [(Term 1 [])])))) arg = do
+  args <- tupleToList arg
+  mExprs <- mapM extractScalar args
+  return (Value (ScalarData (Div (Plus [(Term 1 [(Apply fn mExprs, 1)])]) (Plus [(Term 1 [])]))))
+applyFunc _ (Value fn@(UserIndexedData _ _)) arg = do
   args <- tupleToList arg
   mExprs <- mapM extractScalar args
   return (Value (ScalarData (Div (Plus [(Term 1 [(Apply fn mExprs, 1)])]) (Plus [(Term 1 [])]))))
diff --git a/hs-src/Language/Egison/Parser.hs b/hs-src/Language/Egison/Parser.hs
--- a/hs-src/Language/Egison/Parser.hs
+++ b/hs-src/Language/Egison/Parser.hs
@@ -156,8 +156,11 @@
 
 expr :: Parser EgisonExpr
 expr = P.lexeme lexer (do expr0 <- expr'
-                          expr1 <- option expr0 $ IndexedExpr expr0 <$> many1 (try (char '_' >> expr' >>= return . Subscript) <|> try (char '~' >> expr' >>= return . Superscript) <|> try (string "~_" >> expr' >>= return . SupSubscript))
-                          option expr1 $ PowerExpr expr1 <$> (try $ char '^' >> expr'))
+                          expr1 <- option expr0 $ IndexedExpr expr0 <$> many1 (try (char '_' >> expr' >>= return . Subscript)
+                                                                           <|> try (char '~' >> expr' >>= return . Superscript)
+                                                                           <|> try (string "~_" >> expr' >>= return . SupSubscript))
+                          expr2 <- option expr1 $ UserIndexedExpr expr1 <$> many1 (try $ char '|' >> expr' >>= return . Userscript)
+                          option expr2 $ PowerExpr expr1 <$> (try $ char '^' >> expr'))
                           
 
 expr' :: Parser EgisonExpr
diff --git a/hs-src/Language/Egison/Types.hs b/hs-src/Language/Egison/Types.hs
--- a/hs-src/Language/Egison/Types.hs
+++ b/hs-src/Language/Egison/Types.hs
@@ -17,6 +17,7 @@
     , EgisonPattern (..)
     , Arg (..)
     , Index (..)
+    , UserIndex (..)
     , InnerExpr (..)
     , BindingExpr (..)
     , MatchClause (..)
@@ -197,6 +198,7 @@
   | VarExpr String
   | FreshVarExpr
   | IndexedExpr EgisonExpr [Index EgisonExpr]
+  | UserIndexedExpr EgisonExpr [UserIndex EgisonExpr]
   | PowerExpr EgisonExpr EgisonExpr
   | InductiveDataExpr String [EgisonExpr]
   | TupleExpr [EgisonExpr]
@@ -271,6 +273,9 @@
   | SupSubscript a
  deriving (Eq)
 
+data UserIndex a = Userscript a
+ deriving (Eq)
+
 data InnerExpr =
     ElementExpr EgisonExpr
   | SubCollectionExpr EgisonExpr
@@ -337,6 +342,7 @@
   | Bool Bool
   | ScalarData ScalarData
   | TensorData (Tensor EgisonValue)
+  | UserIndexedData EgisonValue [UserIndex EgisonValue]
   | Float Double Double
   | InductiveData String [EgisonValue]
   | Tuple [EgisonValue]
@@ -1009,6 +1015,7 @@
     f j [] = ""
     f j xs = "[| " ++ unwords (map show (take j xs)) ++ " |] " ++ f j (drop j xs)
   show (TensorData (Tensor ns xs js)) = "(tensor {" ++ unwords (map show ns) ++ "} {" ++ unwords (map show (V.toList xs)) ++ "} )" ++ concat (map show js)
+  show (UserIndexedData x js) = show x ++ concat (map show js)
   show (Float x y) = showComplexFloat x y
   show (InductiveData name []) = "<" ++ name ++ ">"
   show (InductiveData name vals) = "<" ++ name ++ " " ++ unwords (map show vals) ++ ">"
@@ -1104,6 +1111,7 @@
  (CharHash vals) == (CharHash vals') = vals == vals'
  (StrHash vals) == (StrHash vals') = vals == vals'
  (PrimitiveFunc name1 _) == (PrimitiveFunc name2 _) = name1 == name2
+ (UserIndexedData val is) == (UserIndexedData val' is') = (val == val') && (is == is')
  -- Temporary: searching a better solution
  (Func Nothing _ xs1 expr1) == (Func Nothing _ xs2 expr2) = (xs1 == xs2) && (expr1 == expr2)
  (Func (Just name1) _ _ _) == (Func (Just name2) _ _ _) = name1 == name2
@@ -1347,6 +1355,15 @@
   show (Superscript i) = "~" ++ show i
   show (Subscript i) = "_" ++ show i
   show (SupSubscript i) = "~_" ++ show i
+
+instance Show (UserIndex EgisonExpr) where
+  show (Userscript i) = "|" ++ show i
+
+instance Show (UserIndex ScalarData) where
+  show (Userscript i) = "|" ++ show i
+
+instance Show (UserIndex EgisonValue) where
+  show (Userscript i) = "|" ++ show i
 
 nullEnv :: Env
 nullEnv = Env []
diff --git a/lib/math/analysis/derivative.egi b/lib/math/analysis/derivative.egi
--- a/lib/math/analysis/derivative.egi
+++ b/lib/math/analysis/derivative.egi
@@ -18,7 +18,7 @@
        [(,sqrt $g) (* (/ 1 (* 2 (sqrt g))) (∂/∂ g x))]
        [(,** $g $h) (* f (∂/∂ (* (log g) h) x))]
        [<apply $g $args>
-        (sum (map 2#(* (capply `(add-subscript g %1) args) (∂/∂ %2 x))
+        (sum (map 2#(* (capply `g|%1 args) (∂/∂ %2 x))
                   (zip nats args)))]
        ; quote
        [<quote $g> (∂/∂ g x)]
